/ Hex Artifact Content
Login

Artifact 2455b010d792de17c0d29c5439c224fd5a3d9628386d72badb90009ed3608179:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
07f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
0800: 52 45 4e 54 0a 20 20 69 66 28 20 69 44 62 3d 3d  RENT.  if( iDb==
0810: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  1 ) return;.  if
0820: 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  ( !sqlite3BtreeS
0830: 68 61 72 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  harable(pParse->
0840: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
0850: 29 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  ) ) return;.#end
0860: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
0870: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0880: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0890: 20 70 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d   p = &pToplevel-
08a0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
08b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d      if( p->iDb==
08c0: 69 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d  iDb && p->iTab==
08d0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d  iTab ){.      p-
08e0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28  >isWriteLock = (
08f0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c  p->isWriteLock |
0900: 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  | isWriteLock);.
0910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65    }.  }..  nByte
0930: 73 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  s = sizeof(Table
0940: 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70 6c 65 76  Lock) * (pToplev
0950: 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31  el->nTableLock+1
0960: 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
0970: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20  aTableLock =.   
0980: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
0990: 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f 70 6c 65  locOrFree(pTople
09a0: 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70 6c 65 76  vel->db, pToplev
09b0: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20  el->aTableLock, 
09c0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70  nBytes);.  if( p
09d0: 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65  Toplevel->aTable
09e0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
09f0: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0a00: 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65 76 65 6c  leLock[pToplevel
0a10: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b  ->nTableLock++];
0a20: 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20 69 44  .    p->iDb = iD
0a30: 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 20 3d  b;.    p->iTab =
0a40: 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73   iTab;.    p->is
0a50: 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72  WriteLock = isWr
0a60: 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e  iteLock;.    p->
0a70: 7a 4c 6f 63 6b 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zLockName = zNam
0a80: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
0a90: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0aa0: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  eLock = 0;.    s
0ab0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
0ac0: 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20  Toplevel->db);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0ae0: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0af0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b00: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b10: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b20: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0b30: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0b40: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0b50: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0b60: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0b70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0b80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0b90: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0ba0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0bb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0bc0: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0bd0: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0be0: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0bf0: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c00: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c20: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0c30: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0c40: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0c50: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0c60: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0c70: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0c80: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0c90: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0ca0: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0cb0: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 70 2d 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c     p->zLockName,
0ce0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
0cf0: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d00: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d10: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
0d30: 66 20 74 68 65 20 67 69 76 65 6e 20 79 44 62 4d  f the given yDbM
0d40: 61 73 6b 20 6f 62 6a 65 63 74 20 69 73 20 65 6d  ask object is em
0d50: 70 74 79 20 2d 20 69 66 20 69 74 20 63 6f 6e 74  pty - if it cont
0d60: 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31 20 62 69 74  ains no.** 1 bit
0d70: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
0d80: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
0d90: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 29 20  DbMaskAllZero() 
0da0: 61 6e 64 20 44 62 4d 61 73 6b 4e 6f 74 5a 65 72  and DbMaskNotZer
0db0: 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f 73 20 77 68  o().** macros wh
0dc0: 65 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  en SQLITE_MAX_AT
0dd0: 54 41 43 48 45 44 20 69 73 20 67 72 65 61 74 65  TACHED is greate
0de0: 72 20 74 68 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69  r than 30..*/.#i
0df0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
0e00: 41 43 48 45 44 3e 33 30 0a 69 6e 74 20 73 71 6c  ACHED>30.int sql
0e10: 69 74 65 33 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  ite3DbMaskAllZer
0e20: 6f 28 79 44 62 4d 61 73 6b 20 6d 29 7b 0a 20 20  o(yDbMask m){.  
0e30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
0e40: 3b 20 69 3c 73 69 7a 65 6f 66 28 79 44 62 4d 61  ; i<sizeof(yDbMa
0e50: 73 6b 29 3b 20 69 2b 2b 29 20 69 66 28 20 6d 5b  sk); i++) if( m[
0e60: 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
0e70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
0e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0e90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0ea0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0eb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0ec0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0ed0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0ee0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0ef0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0f00: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0f10: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0f20: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0f30: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0f40: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0f50: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0f60: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0f70: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0f80: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0f90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0fa0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0fb0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0fc0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0fd0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0fe0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0ff0: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
1000: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
1010: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1020: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1030: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1040: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
1050: 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1060: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1070: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
1080: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
1090: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
10a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
10b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
10d0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
10e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
10f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
1100: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1110: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1120: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1130: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1140: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1150: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1160: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1170: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
1180: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
1190: 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  e .       || sql
11a0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
11b0: 79 41 62 6f 72 74 28 76 2c 20 70 50 61 72 73 65  yAbort(v, pParse
11c0: 2d 3e 6d 61 79 41 62 6f 72 74 29 29 3b 0a 20 20  ->mayAbort));.  
11d0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
11e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
11f0: 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66  , OP_Halt);..#if
1200: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
1210: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
1220: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  if( pParse->nTab
1230: 6c 65 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e  leLock>0 && db->
1240: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 73 65        sqlite3Use
1260: 72 41 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20  rAuthInit(db);. 
1270: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
1280: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
1290: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
12a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12b0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20  g(pParse, "user 
12c0: 6e 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65  not authenticate
12d0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  d");.        pPa
12e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
12f0: 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20 20 20  _AUTH_USER;.    
1300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1320: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
1330: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
1340: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
1350: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
1360: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
1370: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
1380: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
1390: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
13a0: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
13b0: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
13c0: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
13d0: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
13e0: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
13f0: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
1400: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
1410: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
1420: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
1430: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
1440: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
1450: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1460: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1470: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20  locFailed==0 .  
1480: 20 20 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e     && (DbMaskNon
1490: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Zero(pParse->coo
14a0: 6b 69 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72  kieMask) || pPar
14b0: 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a  se->pConstExpr).
14c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
14d0: 20 69 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61   iDb, i;.      a
14e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
14f0: 62 65 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f  beGetOp(v, 0)->o
1500: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29  pcode==OP_Init )
1510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1520: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30  dbeJumpHere(v, 0
1530: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1540: 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
1550: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
1560: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1570: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 44 62  ;.        if( Db
1580: 4d 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d  MaskTest(pParse-
1590: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
15a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
15b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
15d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70   iDb);.        p
15e0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
15f0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
1600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1610: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20  beAddOp4Int(v,. 
1620: 20 20 20 20 20 20 20 20 20 4f 50 5f 54 72 61 6e           OP_Tran
1630: 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20  saction,        
1640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1650: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
1660: 20 20 20 69 44 62 2c 20 20 20 20 20 20 20 20 20     iDb,         
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
1690: 20 20 20 20 20 20 20 20 20 44 62 4d 61 73 6b 54           DbMaskT
16a0: 65 73 74 28 70 50 61 72 73 65 2d 3e 77 72 69 74  est(pParse->writ
16b0: 65 4d 61 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50  eMask,iDb), /* P
16c0: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  2 */.          p
16d0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
16e0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
16f0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
1700: 20 20 20 20 20 70 53 63 68 65 6d 61 2d 3e 69 47       pSchema->iG
1710: 65 6e 65 72 61 74 69 6f 6e 20 20 20 20 20 20 20  eneration       
1720: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
1730: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1740: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1750: 2e 62 75 73 79 3d 3d 30 20 29 20 73 71 6c 69 74  .busy==0 ) sqlit
1760: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1770: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
1780: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 0a 20 20  beComment((v,.  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 73 65              "use
17a0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3d 25 64 22  sStmtJournal=%d"
17b0: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
17c0: 72 74 20 26 26 20 70 50 61 72 73 65 2d 3e 69 73  rt && pParse->is
17d0: 4d 75 6c 74 69 57 72 69 74 65 29 29 3b 0a 20 20  MultiWrite));.  
17e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
17f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1800: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 66 6f 72  LTABLE.      for
1810: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1820: 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  nVtabLock; i++){
1830: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
1840: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1850: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1860: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1870: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1890: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
18a0: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
18b0: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
18c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
18d0: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
18e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
18f0: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1900: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1910: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1920: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1930: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
1940: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
1950: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
1960: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
1970: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
1980: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
1990: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
19a0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
19b0: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
19c0: 73 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  s(pParse);..    
19d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19e0: 61 6e 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  any AUTOINCREMEN
19f0: 54 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  T data structure
1a00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
1a10: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1a20: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42  e3AutoincrementB
1a30: 65 67 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20  egin(pParse);.. 
1a40: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e       /* Code con
1a50: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1a60: 73 20 74 68 61 74 20 77 68 65 72 65 20 66 61 63  s that where fac
1a70: 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e  tored out of inn
1a80: 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1a90: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43    if( pParse->pC
1aa0: 6f 6e 73 74 45 78 70 72 20 29 7b 0a 20 20 20 20  onstExpr ){.    
1ab0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1ac0: 4c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  L = pParse->pCon
1ad0: 73 74 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  stExpr;.        
1ae0: 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1af0: 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  actor = 0;.     
1b00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
1b10: 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  L->nExpr; i++){.
1b20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1b40: 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70  , pEL->a[i].pExp
1b50: 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69  r, pEL->a[i].u.i
1b60: 43 6f 6e 73 74 45 78 70 72 52 65 67 29 3b 0a 20  ConstExprReg);. 
1b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b80: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
1b90: 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f  ly, jump back to
1ba0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1bb0: 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  f the executable
1bc0: 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20   code. */.      
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1be0: 76 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, 1);.    }.  }
1bf0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
1c00: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
1c10: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1c20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1c30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1c40: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
1c50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  ailed ){.    /* 
1c60: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1c70: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
1c80: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
1c90: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
1ca0: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
1cb0: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
1cc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1cd0: 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 3d 3d 30  pParse->pAinc==0
1ce0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 54 61 62   || pParse->nTab
1cf0: 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >0 );.    sqlite
1d00: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
1d10: 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  , pParse);.    p
1d20: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1d40: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
1d50: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1d60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  .  }.}../*.** Ru
1d70: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
1d80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1d90: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
1da0: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
1db0: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
1dc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
1dd0: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
1de0: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
1df0: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
1e00: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1e10: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
1e20: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
1e30: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
1e40: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
1e50: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
1e60: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
1e70: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
1e80: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
1e90: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
1ea0: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
1eb0: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
1ec0: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
1ed0: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
1ee0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
1ef0: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
1f00: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
1f10: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
1f20: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
1f30: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
1f40: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
1f50: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
1f60: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
1f70: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
1f80: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
1f90: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
1fa0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1fb0: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1fc0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1fd0: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1fe0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1ff0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
2000: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2010: 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
2020: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2030: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2040: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 68 61 72  arse->db;.  char
2050: 20 73 61 76 65 42 75 66 5b 50 41 52 53 45 5f 54   saveBuf[PARSE_T
2060: 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20  AIL_SZ];..  if( 
2070: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
2080: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2090: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c   pParse->nested<
20a0: 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e  10 );  /* Nestin
20b0: 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  g should only be
20c0: 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74   of limited dept
20d0: 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28  h */.  va_start(
20e0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
20f0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d  zSql = sqlite3VM
2100: 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d  Printf(db, zForm
2110: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2120: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
2130: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  l==0 ){.    /* T
2140: 68 69 73 20 63 61 6e 20 72 65 73 75 6c 74 20 65  his can result e
2150: 69 74 68 65 72 20 66 72 6f 6d 20 61 6e 20 4f 4f  ither from an OO
2160: 4d 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  M or because the
2170: 20 66 6f 72 6d 61 74 74 65 64 20 73 74 72 69 6e   formatted strin
2180: 67 0a 20 20 20 20 2a 2a 20 65 78 63 65 65 64 73  g.    ** exceeds
2190: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45   SQLITE_LIMIT_LE
21a0: 4e 47 54 48 2e 20 20 49 6e 20 74 68 65 20 6c 61  NGTH.  In the la
21b0: 74 74 65 72 20 63 61 73 65 2c 20 77 65 20 6e 65  tter case, we ne
21c0: 65 64 20 74 6f 20 73 65 74 0a 20 20 20 20 2a 2a  ed to set.    **
21d0: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
21e0: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
21f0: 46 61 69 6c 65 64 20 29 20 70 50 61 72 73 65 2d  Failed ) pParse-
2200: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f  >rc = SQLITE_TOO
2210: 42 49 47 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  BIG;.    pParse-
2220: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
2230: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  urn;.  }.  pPars
2240: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
2250: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 50  emcpy(saveBuf, P
2260: 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65  ARSE_TAIL(pParse
2270: 29 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  ), PARSE_TAIL_SZ
2280: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 50 41 52 53  );.  memset(PARS
2290: 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20  E_TAIL(pParse), 
22a0: 30 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  0, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
22c0: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
22d0: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
22e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f0: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
2300: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2310: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
2320: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2330: 73 65 29 2c 20 73 61 76 65 42 75 66 2c 20 50 41  se), saveBuf, PA
2340: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2350: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d  pParse->nested--
2360: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2370: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2380: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ION./*.** Return
2390: 20 54 52 55 45 20 69 66 20 7a 54 61 62 6c 65 20   TRUE if zTable 
23a0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
23b0: 68 65 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20  he system table 
23c0: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 0a  that stores the.
23d0: 2a 2a 20 6c 69 73 74 20 6f 66 20 75 73 65 72 73  ** list of users
23e0: 20 61 6e 64 20 74 68 65 69 72 20 61 63 63 65 73   and their acces
23f0: 73 20 63 72 65 64 65 6e 74 69 61 6c 73 2e 0a 2a  s credentials..*
2400: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 73 65  /.int sqlite3Use
2410: 72 41 75 74 68 54 61 62 6c 65 28 63 6f 6e 73 74  rAuthTable(const
2420: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a   char *zTable){.
2430: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2440: 5f 73 74 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c  _stricmp(zTable,
2450: 20 22 73 71 6c 69 74 65 5f 75 73 65 72 22 29 3d   "sqlite_user")=
2460: 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  =0;.}.#endif../*
2470: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2480: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2490: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
24a0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
24b0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
24c0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
24d0: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
24e0: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
24f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
2500: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
2510: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
2520: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
2530: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2540: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2550: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2560: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2570: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
2580: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  d the.** first m
2590: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73  atching table is
25a0: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
25b0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
25c0: 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  licate table.** 
25d0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
25e0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
25f0: 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c  r is TEMP first,
2600: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
2610: 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72   any.** auxiliar
2620: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2630: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
2640: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
2650: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
2660: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
2670: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2680: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
2690: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
26a0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
26b0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
26c0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
26d0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
26e0: 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61  /* All mutexes a
26f0: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
2700: 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20  schema access.  
2710: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c  Make sure we hol
2720: 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73  d them. */.  ass
2730: 65 72 74 28 20 7a 44 61 74 61 62 61 73 65 21 3d  ert( zDatabase!=
2740: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
2750: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
2760: 28 64 62 29 20 29 3b 0a 23 69 66 20 53 51 4c 49  (db) );.#if SQLI
2770: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2780: 43 41 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79  CATION.  /* Only
2790: 20 74 68 65 20 61 64 6d 69 6e 20 75 73 65 72 20   the admin user 
27a0: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e  is allowed to kn
27b0: 6f 77 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ow that the sqli
27c0: 74 65 5f 75 73 65 72 20 74 61 62 6c 65 0a 20 20  te_user table.  
27d0: 2a 2a 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69  ** exists */.  i
27e0: 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68  f( db->auth.auth
27f0: 4c 65 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69  Level<UAUTH_Admi
2800: 6e 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72  n && sqlite3User
2810: 41 75 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29  AuthTable(zName)
2820: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
2830: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
2840: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
2850: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2860: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2870: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  +){.      int j 
2880: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
2890: 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54  i;   /* Search T
28a0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
28b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 44 61  */.      if( zDa
28c0: 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  tabase==0 || sql
28d0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
28e0: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
28f0: 5d 2e 7a 44 62 53 4e 61 6d 65 29 3d 3d 30 20 29  ].zDbSName)==0 )
2900: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2910: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
2920: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20  utexHeld(db, j, 
2930: 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 20  0) );.        p 
2940: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
2950: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53  d(&db->aDb[j].pS
2960: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
2970: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2980: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 70  if( p ) return p
2990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29a0: 20 20 20 20 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64      /* Not found
29b0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 77  .  If the name w
29c0: 65 20 77 65 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  e were looking f
29d0: 6f 72 20 77 61 73 20 74 65 6d 70 2e 73 71 6c 69  or was temp.sqli
29e0: 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a  te_master.    **
29f0: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
2a00: 20 6e 61 6d 65 20 74 6f 20 73 71 6c 69 74 65 5f   name to sqlite_
2a10: 74 65 6d 70 5f 6d 61 73 74 65 72 20 61 6e 64 20  temp_master and 
2a20: 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  try again. */.  
2a30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2a40: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d 41 53 54  ICmp(zName, MAST
2a50: 45 52 5f 4e 41 4d 45 29 21 3d 30 20 29 20 62 72  ER_NAME)!=0 ) br
2a60: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
2a70: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 61  ite3_stricmp(zDa
2a80: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
2a90: 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20  1].zDbSName)!=0 
2aa0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 4e 61  ) break;.    zNa
2ab0: 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45 52  me = TEMP_MASTER
2ac0: 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NAME;.  }.  ret
2ad0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2ae0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2af0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2b00: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
2b10: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
2b20: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
2b30: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
2b40: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
2b50: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2b60: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
2b70: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2b80: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2b90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2ba0: 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65   found.  Also le
2bb0: 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ave an.** error 
2bc0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2bd0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2be0: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
2bf0: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
2c00: 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65  utine and sqlite
2c10: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20  3FindTable() is 
2c20: 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75  that this.** rou
2c30: 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65  tine leaves an e
2c40: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2c50: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
2c60: 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33  where.** sqlite3
2c70: 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73  FindTable() does
2c80: 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a   not..*/.Table *
2c90: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ca0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
2cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2cc0: 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68  context in which
2cd0: 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72   to report error
2ce0: 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c 61 67 73  s */.  u32 flags
2cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2d00: 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 6f 72 20   LOCATE_VIEW or 
2d10: 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a  LOCATE_NOERR */.
2d20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2d30: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
2d40: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
2d50: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
2d60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d70: 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20   *zDbase     /* 
2d80: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2d90: 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20  base.  Might be 
2da0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  NULL */.){.  Tab
2db0: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
2dc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2dd0: 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  b;..  /* Read th
2de0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2df0: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
2e00: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
2e10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
2e20: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
2e30: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
2e40: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
2e50: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
2e60: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
2e70: 77 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20 26 26 20  wnOk)==0 .   && 
2e80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
2e90: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
2ea0: 72 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  rse).  ){.    re
2eb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
2ec0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
2ed0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  ble(db, zName, z
2ee0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2ef0: 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
2f00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2f10: 4c 54 41 42 4c 45 0a 20 20 20 20 2f 2a 20 49 66  LTABLE.    /* If
2f20: 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f   zName is the no
2f30: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2f40: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
2f50: 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e  ema created usin
2f60: 67 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 2c  g.    ** CREATE,
2f70: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
2f80: 65 65 20 69 66 20 69 74 20 69 73 20 74 68 65 20  ee if it is the 
2f90: 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69 72 74 75  name of an virtu
2fa0: 61 6c 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  al table that.  
2fb0: 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 6e 20 65    ** can be an e
2fc0: 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
2fd0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
2fe0: 66 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  f( pParse->disab
2ff0: 6c 65 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20  leVtab==0 ){.   
3000: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
3010: 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74  = (Module*)sqlit
3020: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
3030: 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b  aModule, zName);
3040: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 3d  .      if( pMod=
3050: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  =0 && sqlite3_st
3060: 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70  rnicmp(zName, "p
3070: 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29  ragma_", 7)==0 )
3080: 7b 0a 20 20 20 20 20 20 20 20 70 4d 6f 64 20 3d  {.        pMod =
3090: 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74   sqlite3PragmaVt
30a0: 61 62 52 65 67 69 73 74 65 72 28 64 62 2c 20 7a  abRegister(db, z
30b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
30c0: 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26 26       if( pMod &&
30d0: 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e   sqlite3VtabEpon
30e0: 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28 70  ymousTableInit(p
30f0: 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b 0a  Parse, pMod) ){.
3100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
3110: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20 20  Mod->pEpoTab;.  
3120: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
3130: 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  if.    if( flags
3140: 20 26 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20   & LOCATE_NOERR 
3150: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
3160: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
3170: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ema = 1;.  }else
3180: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
3190: 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64 69 73  ) && pParse->dis
31a0: 61 62 6c 65 56 74 61 62 20 29 7b 0a 20 20 20 20  ableVtab ){.    
31b0: 70 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  p = 0;.  }..  if
31c0: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ( p==0 ){.    co
31d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  nst char *zMsg =
31e0: 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f   flags & LOCATE_
31f0: 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68 20  VIEW ? "no such 
3200: 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68  view" : "no such
3210: 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28   table";.    if(
3220: 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20   zDbase ){.     
3230: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3240: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
3250: 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61  .%s", zMsg, zDba
3260: 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  se, zName);.    
3270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
3280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3290: 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a  rse, "%s: %s", z
32a0: 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Msg, zName);.   
32b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
32c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
32d0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 64  ate the table id
32e0: 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e 0a  entified by *p..
32f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
3300: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
3310: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
3320: 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72 65  e(). The differe
3330: 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 73  nce between.** s
3340: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
3350: 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75 6e  e() and this fun
3360: 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74 68  ction is that th
3370: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 74  is function rest
3380: 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65 61  ricts.** the sea
3390: 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28 70  rch to schema (p
33a0: 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69 74  ->pSchema) if it
33b0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d   is not NULL. p-
33c0: 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65 0a  >pSchema may be.
33d0: 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69  ** non-NULL if i
33e0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 76  t is part of a v
33f0: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 70  iew or trigger p
3400: 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69 6f  rogram definitio
3410: 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74 65  n. See.** sqlite
3420: 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66 6f  3FixSrcList() fo
3430: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61  r details..*/.Ta
3440: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
3450: 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20 50  teTableItem(.  P
3460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
3470: 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20 73 74   u32 flags,.  st
3480: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
3490: 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  m *p.){.  const 
34a0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73  char *zDb;.  ass
34b0: 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d  ert( p->pSchema=
34c0: 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61  =0 || p->zDataba
34d0: 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  se==0 );.  if( p
34e0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
34f0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
3500: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
3510: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3520: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62  Schema);.    zDb
3530: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
3540: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
3550: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
3560: 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73  Db = p->zDatabas
3570: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
3580: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3590: 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61 67 73  le(pParse, flags
35a0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  , p->zName, zDb)
35b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
35c0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
35d0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
35e0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
35f0: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
3600: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
3610: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
3620: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
3630: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
3640: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
3650: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
3660: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
3670: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
3680: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
3690: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
36a0: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
36b0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
36c0: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
36d0: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
36e0: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
36f0: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
3700: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
3710: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
3720: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
3730: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
3740: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
3750: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
3760: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
3770: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
3780: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
3790: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
37a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
37b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
37c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
37d0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
37e0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f 2a  0;.  int i;.  /*
37f0: 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65   All mutexes are
3800: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63   required for sc
3810: 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61  hema access.  Ma
3820: 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20  ke sure we hold 
3830: 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72  them. */.  asser
3840: 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c  t( zDb!=0 || sql
3850: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
3860: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
3870: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
3880: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
3890: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
38a0: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
38b0: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
38c0: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
38d0: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
38e0: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
38f0: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
3900: 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20  assert( pSchema 
3910: 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  );.    if( zDb &
3920: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
3930: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
3940: 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63 6f 6e  .zDbSName) ) con
3950: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
3960: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3970: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
3980: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
3990: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
39a0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
39b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
39c0: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
39d0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
39e0: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68  /*.** Reclaim th
39f0: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  e memory used by
3a00: 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 76 6f 69   an index.*/.voi
3a10: 64 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64  d sqlite3FreeInd
3a20: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3a30: 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64  Index *p){.#ifnd
3a40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
3a50: 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33  NALYZE.  sqlite3
3a60: 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c  DeleteIndexSampl
3a70: 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69  es(db, p);.#endi
3a80: 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  f.  sqlite3ExprD
3a90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
3aa0: 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73  rtIdxWhere);.  s
3ab0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
3ac0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  lete(db, p->aCol
3ad0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
3ae0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
3af0: 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70 2d  olAff);.  if( p-
3b00: 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71 6c  >isResized ) sql
3b10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 28  ite3DbFree(db, (
3b20: 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c 6c  void *)p->azColl
3b30: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
3b40: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
3b50: 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33  _STAT4.  sqlite3
3b60: 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45 73  _free(p->aiRowEs
3b70: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  t);.#endif.  sql
3b80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3b90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  );.}../*.** For 
3ba0: 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64  the index called
3bb0: 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20   zIdxName which 
3bc0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
3bd0: 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a  database iDb,.**
3be0: 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64   unlike that ind
3bf0: 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c  ex from its Tabl
3c00: 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  e then remove th
3c10: 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20  e index from.** 
3c20: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
3c30: 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c  able and free al
3c40: 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  l memory structu
3c50: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  res associated.*
3c60: 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78  * with the index
3c70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3c80: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
3c90: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3ca0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
3cb0: 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65  t char *zIdxName
3cc0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
3cd0: 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  ex;.  Hash *pHas
3ce0: 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  h;..  assert( sq
3cf0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3d00: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
3d10: 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 64   );.  pHash = &d
3d20: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
3d30: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
3d40: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
3d50: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
3d60: 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b 0a  , zIdxName, 0);.
3d70: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3d80: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3d90: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3da0: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
3db0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
3dc0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
3dd0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3de0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3df0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
3e00: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3e10: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3e20: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3e30: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3e40: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3e50: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3e60: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3e70: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3e80: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3e90: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3ea0: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
3eb0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
3ec0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
3ed0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
3ee0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
3ef0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3f00: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72 65 65  .    sqlite3Free
3f20: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
3f30: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62  );.  }.  db->mDb
3f40: 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
3f50: 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a  SchemaChange;.}.
3f60: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f  ./*.** Look thro
3f70: 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ugh the list of 
3f80: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
3f90: 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  les in db->aDb[]
3fa0: 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68   and if.** any h
3fb0: 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  ave been closed,
3fc0: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
3fd0: 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61  m the list.  Rea
3fe0: 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64  llocate the.** d
3ff0: 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75  b->aDb[] structu
4000: 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20  re to a smaller 
4010: 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  size, if possibl
4020: 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30  e..**.** Entry 0
4030: 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74   (the "main" dat
4040: 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79  abase) and entry
4050: 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64   1 (the "temp" d
4060: 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20  atabase).** are 
4070: 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73  never candidates
4080: 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61   for being colla
4090: 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  psed..*/.void sq
40a0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
40b0: 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74  abaseArray(sqlit
40c0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
40d0: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  , j;.  for(i=j=2
40e0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
40f0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
4100: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
4110: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
4120: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
4130: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4140: 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  db, pDb->zDbSNam
4150: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
4160: 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  DbSName = 0;.   
4170: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4180: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29   }.    if( j<i )
4190: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  {.      db->aDb[
41a0: 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b  j] = db->aDb[i];
41b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
41c0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20    }.  db->nDb = 
41d0: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
41e0: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
41f0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
4200: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
4210: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
4220: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
4230: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
4240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4250: 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64   db->aDb);.    d
4260: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
4270: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
4280: 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73  *.** Reset the s
4290: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61  chema for the da
42a0: 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20  tabase at index 
42b0: 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74  iDb.  Also reset
42c0: 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68   the.** TEMP sch
42d0: 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65 74 20  ema.  The reset 
42e0: 69 73 20 64 65 66 65 72 72 65 64 20 69 66 20 64  is deferred if d
42f0: 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20 69  b->nSchemaLock i
4300: 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44  s not zero..** D
4310: 65 66 65 72 72 65 64 20 72 65 73 65 74 73 20 6d  eferred resets m
4320: 61 79 20 62 65 20 72 75 6e 20 62 79 20 63 61 6c  ay be run by cal
4330: 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c 30 2e  ling with iDb<0.
4340: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4350: 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73  ResetOneSchema(s
4360: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4370: 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iDb){.  int i;. 
4380: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
4390: 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  >nDb );..  if( i
43a0: 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
43b0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
43c0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
43d0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 44  iDb, 0) );.    D
43e0: 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
43f0: 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74 57 61   iDb, DB_ResetWa
4400: 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53 65 74  nted);.    DbSet
4410: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20  Property(db, 1, 
4420: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
4430: 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67  .    db->mDbFlag
4440: 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68  s &= ~DBFLAG_Sch
4450: 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a  emaKnownOk;.  }.
4460: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65  .  if( db->nSche
4470: 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  maLock==0 ){.   
4480: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4490: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
44a0: 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65 72   if( DbHasProper
44b0: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73  ty(db, i, DB_Res
44c0: 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20 20  etWanted) ){.   
44d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
44e0: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
44f0: 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  i].pSchema);.   
4500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
4510: 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
4520: 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61  l schema informa
4530: 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74  tion from all at
4540: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
4550: 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22   (including.** "
4560: 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70 22  main" and "temp"
4570: 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  ) for a single d
4580: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
4590: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
45a0: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
45b0: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73  asOfConnection(s
45c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
45d0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt i;.  sqlite3B
45e0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
45f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
4600: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4610: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
4620: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
4630: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
4640: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  .      if( db->n
4650: 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b  SchemaLock==0 ){
4660: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4670: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
4680: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
4690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
46a0: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
46b0: 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e  , i, DB_ResetWan
46c0: 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ted);.      }.  
46d0: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44    }.  }.  db->mD
46e0: 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46 4c  bFlags &= ~(DBFL
46f0: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 7c  AG_SchemaChange|
4700: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
4710: 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33  wnOk);.  sqlite3
4720: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
4730: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
4740: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
4750: 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d    if( db->nSchem
4760: 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  aLock==0 ){.    
4770: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
4780: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
4790: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
47a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
47b0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
47c0: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
47d0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
47e0: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
47f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4800: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d   db->mDbFlags &=
4810: 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43   ~DBFLAG_SchemaC
4820: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
4830: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
4840: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
4850: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
4860: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
4870: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
4880: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
4890: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
48a0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
48b0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
48c0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
48d0: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
48e0: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
48f0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
4900: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
4910: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
4920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
4930: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
4940: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
4950: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4960: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
4970: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4980: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
4990: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
49a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
49b0: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20  pCol->zColl);.  
49c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
49d0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
49e0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->aCol);.  }.}..
49f0: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
4a00: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
4a10: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
4a20: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
4a30: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
4a40: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
4a50: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
4a60: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
4a70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
4a80: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
4a90: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
4aa0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
4ab0: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
4ac0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
4ad0: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
4ae0: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
4af0: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
4b00: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
4b10: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
4b20: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
4b30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
4b40: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
4b50: 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74  * The db paramet
4b60: 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  er is optional. 
4b70: 20 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66   It is needed if
4b80: 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
4b90: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c  t .** contains l
4ba0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4bb0: 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73    (Table objects
4bc0: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64   in the schema d
4bd0: 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f  o not use.** loo
4be0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62  kaside memory, b
4bf0: 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61  ut some ephemera
4c00: 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
4c10: 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20  do.)  Or the.** 
4c20: 64 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e  db parameter can
4c30: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62   be used with db
4c40: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74  ->pnBytesFreed t
4c50: 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65  o measure the me
4c60: 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20  mory.** used by 
4c70: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
4c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c90: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
4ca0: 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c   deleteTable(sql
4cb0: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
4cc0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
4cd0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
4ce0: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
4cf0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52 65 63  E_DEBUG.  /* Rec
4d00: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
4d10: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
4d20: 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69  okaside allocati
4d30: 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61  ons in schema Ta
4d40: 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20  bles.  ** prior 
4d50: 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65  to doing any fre
4d60: 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  e() operations. 
4d70: 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61   Since schema Ta
4d80: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a  bles do not use.
4d90: 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20    ** lookaside, 
4da0: 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75  this number shou
4db0: 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ld not change. *
4dc0: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69  /.  int nLookasi
4dd0: 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62  de = 0;.  if( db
4de0: 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62   && (pTable->tab
4df0: 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
4e00: 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eral)==0 ){.    
4e10: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c  nLookaside = sql
4e20: 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65  ite3LookasideUse
4e30: 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  d(db, 0);.  }.#e
4e40: 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ndif..  /* Delet
4e50: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
4e60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4e70: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4e80: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4e90: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4ea0: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4eb0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4ec0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4ed0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4ee0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4ef0: 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20  e->pSchema.     
4f00: 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61      || (IsVirtua
4f10: 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e  l(pTable) && pIn
4f20: 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
4f30: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
4f40: 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20  DEF) );.    if( 
4f50: 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e  (db==0 || db->pn
4f60: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
4f70: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
4f80: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ble) ){.      ch
4f90: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
4fa0: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
4fb0: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
4fc0: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
4fd0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
4fe0: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
4ff0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
5000: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
5010: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
5020: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
5030: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5040: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
5050: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
5060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5070: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
5080: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
5090: 20 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64    sqlite3FreeInd
50a0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
50b0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
50c0: 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79   any foreign key
50d0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
50e0: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73  is table. */.  s
50f0: 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64  qlite3FkDelete(d
5100: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  b, pTable);..  /
5110: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
5120: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
5130: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
5140: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
5150: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
5160: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5170: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
5180: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5190: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
51a0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
51b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
51c0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
51d0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
51e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
51f0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  db, pTable->pChe
5200: 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ck);.#ifndef SQL
5210: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5220: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56  TABLE.  sqlite3V
5230: 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61  tabClear(db, pTa
5240: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ble);.#endif.  s
5250: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5260: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
5270: 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c  Verify that no l
5280: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
5290: 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65  was used by sche
52a0: 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61  ma tables */.  a
52b0: 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64  ssert( nLookasid
52c0: 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69  e==0 || nLookasi
52d0: 64 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61  de==sqlite3Looka
52e0: 73 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29  sideUsed(db,0) )
52f0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5300: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5310: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
5320: 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f  pTable){.  /* Do
5330: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
5340: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
5350: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
5360: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
5370: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
5380: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
5390: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
53a0: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
53b0: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52  (--pTable->nTabR
53c0: 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b  ef)>0) ) return;
53d0: 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64  .  deleteTable(d
53e0: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a  b, pTable);.}...
53f0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
5400: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
5410: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
5420: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
5430: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
5440: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
5450: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
5460: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
5470: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
5480: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
5490: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
54a0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
54b0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
54c0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62    Table *p;.  Db
54d0: 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
54e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
54f0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
5500: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
5510: 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65  assert( zTabName
5520: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
5530: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
5540: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
5550: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
5560: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
5570: 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74  ;  /* Zero-lengt
5580: 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72  h table names ar
5590: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70  e allowed */.  p
55a0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
55b0: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
55c0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
55d0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
55e0: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29  sh, zTabName, 0)
55f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  ;.  sqlite3Delet
5600: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
5610: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
5620: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
5630: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ange;.}../*.** G
5640: 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65  iven a token, re
5650: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
5660: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
5670: 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a  he text of that.
5680: 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65  ** token.  Space
5690: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
56a0: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
56b0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
56c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
56d0: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
56e0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
56f0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
5700: 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f  .** Any quotatio
5710: 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e  n marks (ex:  "n
5720: 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e  ame", 'name', [n
5730: 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29  ame], or `name`)
5740: 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e   that.** surroun
5750: 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  d the body of th
5760: 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f  e token are remo
5770: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ved..**.** Token
5780: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
5790: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
57a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
57b0: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
57c0: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
57d0: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
57e0: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
57f0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
5800: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
5810: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
5820: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
5830: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
5840: 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74  eFromToken(sqlit
5850: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5860: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
5870: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
5880: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
5890: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
58a0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61  p(db, (char*)pNa
58b0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
58c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
58d0: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
58e0: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
58f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
5900: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
5910: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
5920: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
5930: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
5940: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
5950: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
5960: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
5970: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
5980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5990: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
59a0: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
59b0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
59c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
59d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
59e0: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
59f0: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41  STER_ROOT, 1, MA
5a00: 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71  STER_NAME);.  sq
5a10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
5a20: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
5a30: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
5a40: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
5a50: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
5a60: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
5a70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
5a80: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
5a90: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5aa0: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5ab0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5ac0: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5ad0: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
5ae0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5af0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5b00: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
5b10: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5b20: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5b30: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
5b40: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
5b50: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
5b60: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
5b70: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
5b80: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5b90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5ba0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5bb0: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5bc0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5bd0: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
5be0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
5bf0: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72  Db *pDb;.    for
5c00: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
5c10: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
5c20: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5c30: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  -){.      if( 0=
5c40: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
5c50: 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20  (pDb->zDbSName, 
5c60: 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a  zName) ) break;.
5c70: 20 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20        /* "main" 
5c80: 69 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63  is always an acc
5c90: 65 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f  eptable alias fo
5ca0: 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61  r the primary da
5cb0: 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
5cc0: 65 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62  even if it has b
5cd0: 65 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e  een renamed usin
5ce0: 67 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  g SQLITE_DBCONFI
5cf0: 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f  G_MAINDBNAME. */
5d00: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20  .      if( i==0 
5d10: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
5d20: 72 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e  ricmp("main", zN
5d30: 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ame) ) break;.  
5d40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5d50: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   i;.}../*.** The
5d60: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
5d70: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
5d80: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
5d90: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
5da0: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
5db0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
5dc0: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
5dd0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
5de0: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
5df0: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
5e00: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
5e10: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
5e20: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
5e30: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
5e40: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
5e50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
5e60: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
5e70: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5ea0: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
5eb0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ed0: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
5ee0: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  arching for */. 
5ef0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5f00: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
5f10: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20  , pName);.  i = 
5f20: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5f30: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
5f40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5f50: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
5f60: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
5f70: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
5f80: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
5f90: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5fa0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
5fb0: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
5fc0: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
5fd0: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
5fe0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5ff0: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
6000: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
6010: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
6020: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
6030: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
6040: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
6050: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
6060: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
6070: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
6080: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
6090: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
60a0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
60b0: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
60c0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
60d0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
60e0: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
60f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
6100: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
6110: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
6120: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
6130: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
6140: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
6150: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6160: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
6170: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
6180: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
6190: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
61a0: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
61b0: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
61c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
61d0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
61e0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
61f0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6200: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
6210: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
6220: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
6230: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
6240: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
6250: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
6260: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
6270: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
6280: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
6290: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
62a0: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
62b0: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
62c0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
62e0: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
62f0: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
6300: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6310: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73  Parse->db;..  as
6320: 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20  sert( pName2!=0 
6330: 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d  );.  if( pName2-
6340: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  >n>0 ){.    if( 
6350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20  db->init.busy ) 
6360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
6370: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6380: 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73  "corrupt databas
6390: 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e");.      retur
63a0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
63b0: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
63c0: 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  2;.    iDb = sql
63d0: 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70  ite3FindDb(db, p
63e0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
63f0: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
6400: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6410: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
6420: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
6430: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74  ame1);.      ret
6440: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
6450: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6460: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
6470: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
6480: 75 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45  usy || IN_RENAME
6490: 5f 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20  _OBJECT.        
64a0: 20 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62       || (db->mDb
64b0: 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56  Flags & DBFLAG_V
64c0: 61 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20  acuum)!=0);.    
64d0: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
64e0: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
64f0: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
6500: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
6510: 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52  /*.** True if PR
6520: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
6530: 68 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e  hema is ON.*/.in
6540: 74 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c  t sqlite3Writabl
6550: 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20  eSchema(sqlite3 
6560: 2a 64 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65  *db){.  testcase
6570: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  ( (db->flags&(SQ
6580: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
6590: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
65a0: 65 29 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  e))==0 );.  test
65b0: 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73  case( (db->flags
65c0: 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  &(SQLITE_WriteSc
65d0: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
65e0: 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20  nsive))==.      
65f0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6600: 57 72 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20  WriteSchema );. 
6610: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6620: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6630: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6640: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20  _Defensive))==. 
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
6660: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29  LITE_Defensive )
6670: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  ;.  testcase( (d
6680: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6690: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
66a0: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
66b0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
66c0: 20 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63   (SQLITE_WriteSc
66d0: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
66e0: 6e 73 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75  nsive) );.  retu
66f0: 72 6e 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53  rn (db->flags&(S
6700: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6710: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
6720: 76 65 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69  ve))==SQLITE_Wri
6730: 74 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a  teSchema;.}../*.
6740: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6750: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
6760: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
6770: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
6780: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
6790: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
67a0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
67b0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
67c0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
67d0: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
67e0: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
67f0: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
6800: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
6810: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
6820: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
6830: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
6840: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
6850: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
6860: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
6870: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
6880: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
6890: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
68a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
68b0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
68c0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
68d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
68e0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
68f0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
6900: 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53  sqlite3WritableS
6910: 63 68 65 6d 61 28 70 50 61 72 73 65 2d 3e 64 62  chema(pParse->db
6920: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
6930: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e  & 0==sqlite3StrN
6940: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ICmp(zName, "sql
6950: 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20  ite_", 7) ){.   
6960: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6970: 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74  (pParse, "object
6980: 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66   name reserved f
6990: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a  or internal use:
69a0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
69b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
69c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
69d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
69e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
69f0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
6a00: 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a  ndex of a table.
6a10: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
6a20: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
6a30: 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  (Table *pTab){. 
6a40: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72   Index *p;.  for
6a50: 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  (p=pTab->pIndex;
6a60: 20 70 20 26 26 20 21 49 73 50 72 69 6d 61 72 79   p && !IsPrimary
6a70: 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d 70  KeyIndex(p); p=p
6a80: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74  ->pNext){}.  ret
6a90: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
6aa0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d  Return the colum
6ab0: 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20  n of index pIdx 
6ac0: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
6ad0: 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c   to table.** col
6ae0: 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75 72  umn iCol.  Retur
6af0: 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e  n -1 if not foun
6b00: 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65  d..*/.i16 sqlite
6b10: 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49  3ColumnOfIndex(I
6b20: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36 20  ndex *pIdx, i16 
6b30: 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
6b40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
6b50: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
6b60: 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  {.    if( iCol==
6b70: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
6b80: 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  ] ) return i;.  
6b90: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
6ba0: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
6bb0: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
6bc0: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
6bd0: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
6be0: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
6bf0: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
6c00: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
6c10: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
6c20: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
6c30: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
6c40: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
6c50: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
6c60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6c70: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
6c80: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
6c90: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
6ca0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
6cb0: 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a  ame. The isTemp.
6cc0: 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ** flag is true 
6cd0: 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f  if the table sho
6ce0: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
6cf0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
6d00: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
6d10: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68  instead of in th
6d20: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
6d30: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e  file.  This is n
6d40: 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65  ormally the case
6d50: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45  .** when the "TE
6d60: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
6d70: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
6d80: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
6d90: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
6da0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
6db0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
6dc0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
6dd0: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
6de0: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
6df0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
6e00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6e10: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
6e20: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
6e30: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
6e40: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
6e50: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
6e60: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
6e70: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
6e80: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
6e90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
6ea0: 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  the sqlite3EndTa
6eb0: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ble() routine.**
6ec0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
6ed0: 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74  mplete the const
6ee0: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ruction of the n
6ef0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e  ew table record.
6f00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6f10: 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61  StartTable(.  Pa
6f20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
6f30: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
6f40: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6f50: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
6f60: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
6f70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
6f80: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
6f90: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
6fa0: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
6fb0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6fc0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6fd0: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
6fe0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6ff0: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
7000: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
7010: 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w,      /* True 
7020: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
7030: 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72  W */.  int isVir
7040: 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20  tual,   /* True 
7050: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 52  if this is a VIR
7060: 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TUAL table */.  
7070: 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
7080: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
7090: 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  f table already 
70a0: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
70b0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
70c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
70d0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
70e0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
70f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7100: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
7110: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
7120: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
7130: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f  tabase number to
7140: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
7150: 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  e in */.  Token 
7160: 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e  *pName;    /* Un
7170: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
7180: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63  f the table to c
7190: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20  reate */..  if( 
71a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
71b0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
71c0: 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53  m==1 ){.    /* S
71d0: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 50 61  pecial case:  Pa
71e0: 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  rsing the sqlite
71f0: 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c 69 74  _master or sqlit
7200: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 73 63  e_temp_master sc
7210: 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44 62 20  hema */.    iDb 
7220: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
7230: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
7240: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7250: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
7260: 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20  ));.    pName = 
7270: 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b  pName1;.  }else{
7280: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  .    /* The comm
7290: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69  on case */.    i
72a0: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
72b0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
72c0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
72d0: 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
72e0: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
72f0: 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
7300: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
7310: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26  && pName2->n>0 &
7320: 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  & iDb!=1 ){.    
7330: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
7340: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
7350: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
7360: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
7370: 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 74  less .      ** t
7380: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
7390: 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61   is "temp" anywa
73a0: 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  y.  */.      sql
73b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
73c0: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
73d0: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
73e0: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
73f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7400: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
7410: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
7420: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
7430: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
7440: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7450: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
7460: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
7470: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73  BJECT ){.      s
7480: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
7490: 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
74a0: 69 64 2a 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  id*)zName, pName
74b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
74c0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
74d0: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66  n = *pName;.  if
74e0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
74f0: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
7500: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
7510: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
7520: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
7530: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7540: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7550: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
7560: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
7570: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
7580: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
7590: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69  TION.  assert( i
75a0: 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65  sTemp==0 || isTe
75b0: 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  mp==1 );.  asser
75c0: 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20  t( isView==0 || 
75d0: 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b  isView==1 );.  {
75e0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
75f0: 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b  t u8 aCode[] = {
7600: 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  .       SQLITE_C
7610: 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20  REATE_TABLE,.   
7620: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7630: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20  E_TEMP_TABLE,.  
7640: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
7650: 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20  TE_VIEW,.       
7660: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7670: 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20  MP_VIEW.    };. 
7680: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
7690: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
76a0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
76b0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
76c0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
76d0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
76e0: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
76f0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
7700: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7710: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
7720: 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26  f( !isVirtual &&
7730: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
7740: 6b 28 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61  k(pParse, (int)a
7750: 43 6f 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73  Code[isTemp+2*is
7760: 56 69 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20  View],.         
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
7790: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
77a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
77b0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
77c0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
77d0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
77e0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
77f0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
7800: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
7810: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
7820: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
7830: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
7840: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
7850: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
7860: 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20  ** it does. The 
7870: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
7880: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65  the statement be
7890: 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70  ing parsed was p
78a0: 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e  assed.  ** to an
78b0: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
78c0: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e  _vtab() call. In
78d0: 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
78e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
78f0: 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20  .  ** and types 
7900: 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f  will be used, so
7910: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
7920: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61  d to test for na
7930: 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c  mespace.  ** col
7940: 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  lisions..  */.  
7950: 69 66 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f  if( !IN_SPECIAL_
7960: 50 41 52 53 45 20 29 7b 0a 20 20 20 20 63 68 61  PARSE ){.    cha
7970: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
7980: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
7990: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
79a0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
79b0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
79c0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
79d0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
79e0: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
79f0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
7a00: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
7a10: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
7a20: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
7a30: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
7a40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a50: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7a60: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7a70: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7a80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7a90: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7aa0: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7ab0: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7ac0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7ad0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
7ae0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
7af0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7b00: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7b10: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
7b20: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
7b30: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
7b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7b50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7b60: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7b70: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7b80: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7b90: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7ba0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7bb0: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7bc0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7bd0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7be0: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
7bf0: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
7c00: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
7c10: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
7c20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
7c30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
7c40: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7c50: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
7c60: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7c70: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
7c80: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
7c90: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
7ca0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
7cb0: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
7cc0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
7cd0: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20  pTable->nTabRef 
7ce0: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
7cf0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
7d00: 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  T.  pTable->nRow
7d10: 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33  LogEst = sqlite3
7d20: 4c 6f 67 45 73 74 28 53 51 4c 49 54 45 5f 44 45  LogEst(SQLITE_DE
7d30: 46 41 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23  FAULT_ROWEST);.#
7d40: 65 6c 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  else.  pTable->n
7d50: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
7d60: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
7d70: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
7d80: 35 37 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  576) );.#endif. 
7d90: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
7da0: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
7db0: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
7dc0: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
7dd0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7de0: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
7df0: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
7e00: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
7e10: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
7e20: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
7e30: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
7e40: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
7e50: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
7e60: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
7e70: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
7e80: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
7e90: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7ea0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
7eb0: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
7ec0: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
7ed0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
7ee0: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
7ef0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
7f00: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
7f10: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
7f20: 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c   0) );.    pTabl
7f30: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  e->pSchema->pSeq
7f40: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
7f50: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
7f60: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
7f70: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
7f80: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
7f90: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
7fa0: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
7fb0: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
7fc0: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
7fd0: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
7fe0: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
7ff0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
8000: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
8010: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
8020: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
8030: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
8040: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
8050: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
8060: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
8070: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
8080: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
8090: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
80a0: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
80b0: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
80c0: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
80d0: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
80e0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
80f0: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
8100: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
8110: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
8120: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
8130: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
8140: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
8150: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
8160: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
8170: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
8180: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
8190: 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b  .    /* nullRow[
81a0: 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72  ] is an OP_Recor
81b0: 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  d encoding of a 
81c0: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35  row containing 5
81d0: 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74   NULLs */.    st
81e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
81f0: 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c  nullRow[] = { 6,
8200: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
8210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
8220: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
8230: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
8240: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
8250: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8260: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
8270: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
8280: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
8290: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
82a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
82b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
82c0: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
82d0: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
82e0: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
82f0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
8300: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
8310: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
8320: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
8330: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
8340: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
8350: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
8360: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8370: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
8380: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
8390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
83a0: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
83b0: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
83c0: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
83d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
83e0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
83f0: 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  b);.    addr1 = 
8400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8410: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
8420: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8430: 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d  v);.    fileForm
8440: 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  at = (db->flags 
8450: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  & SQLITE_LegacyF
8460: 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20  ileFmt)!=0 ?.   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
8480: 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49   : SQLITE_MAX_FI
8490: 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73  LE_FORMAT;.    s
84a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
84b0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
84c0: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c  , iDb, BTREE_FIL
84d0: 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f  E_FORMAT, fileFo
84e0: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
84f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8500: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
8510: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
8520: 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29  CODING, ENC(db))
8530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8540: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
8550: 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  r1);..    /* Thi
8560: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
8570: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
8580: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
8590: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
85a0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
85b0: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
85c0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
85d0: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
85e0: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
85f0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
8600: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
8610: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
8620: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
8630: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
8640: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
8650: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
8660: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
8670: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
8680: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
8690: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
86a0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
86b0: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
86c0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
86d0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
86e0: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
86f0: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
8700: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
8710: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
8720: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
8730: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
8740: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
8750: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
8760: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
8770: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8780: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
8790: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
87a0: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
87b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
87c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
87d0: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
87e0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
87f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64       pParse->add
8800: 72 43 72 54 61 62 20 3d 0a 20 20 20 20 20 20 20  rCrTab =.       
8810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8820: 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
8830: 42 74 72 65 65 2c 20 69 44 62 2c 20 72 65 67 32  Btree, iDb, reg2
8840: 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b  , BTREE_INTKEY);
8850: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8860: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
8870: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
8880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
88a0: 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a  owid, 0, reg1);.
88b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
88c0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
88d0: 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75  , 6, reg3, 0, nu
88e0: 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43  llRow, P4_STATIC
88f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8900: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
8910: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
8920: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
8930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
8940: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
8950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8960: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
8970: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
8980: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
8990: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
89a0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
89b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
89c0: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
89d0: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
89e0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
89f0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
8a00: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
8a10: 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20   Set properties 
8a20: 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  of a table colum
8a30: 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28  n based on the (
8a40: 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65  magical).** name
8a50: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a   of the column..
8a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
8a70: 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55  ABLE_HIDDEN_COLU
8a80: 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MNS.void sqlite3
8a90: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
8aa0: 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a  FromName(Table *
8ab0: 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43  pTab, Column *pC
8ac0: 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ol){.  if( sqlit
8ad0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c  e3_strnicmp(pCol
8ae0: 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64  ->zName, "__hidd
8af0: 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b  en__", 10)==0 ){
8b00: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
8b10: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
8b20: 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  IDDEN;.  }else i
8b30: 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21  f( pTab && pCol!
8b40: 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28  =pTab->aCol && (
8b50: 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67  pCol[-1].colFlag
8b60: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44  s & COLFLAG_HIDD
8b70: 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  EN) ){.    pTab-
8b80: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
8b90: 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d  OOOHidden;.  }.}
8ba0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
8bb0: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
8bc0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
8bd0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
8be0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
8bf0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
8c00: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
8c10: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
8c20: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
8c30: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
8c40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8c50: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
8c60: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
8c70: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
8c80: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
8c90: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
8ca0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
8cb0: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
8cc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8cd0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
8ce0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
8cf0: 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  Name, Token *pTy
8d00: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
8d10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
8d20: 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79   *z;.  char *zTy
8d30: 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pe;.  Column *pC
8d40: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
8d50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8d60: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8d70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
8d80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8d90: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
8da0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8db0: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
8dc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8dd0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8de0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
8df0: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
8e00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8e10: 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   z = sqlite3DbMa
8e20: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d  llocRaw(db, pNam
8e30: 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20  e->n + pType->n 
8e40: 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  + 2);.  if( z==0
8e50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8e60: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
8e70: 54 20 29 20 73 71 6c 69 74 65 33 52 65 6e 61 6d  T ) sqlite3Renam
8e80: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
8e90: 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d  , (void*)z, pNam
8ea0: 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20  e);.  memcpy(z, 
8eb0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
8ec0: 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e  >n);.  z[pName->
8ed0: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
8ee0: 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  3Dequote(z);.  f
8ef0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
8f00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
8f10: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
8f20: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
8f30: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
8f40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8f50: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
8f60: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
8f70: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
8f80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8f90: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8fa0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
8fb0: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
8fc0: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
8fd0: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
8fe0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
8ff0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
9000: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
9010: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
9020: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
9030: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
9040: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9050: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
9060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
9070: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
9080: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
9090: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
90a0: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
90b0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
90c0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
90d0: 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43   = z;.  sqlite3C
90e0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
90f0: 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29  romName(p, pCol)
9100: 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d  ;. .  if( pType-
9110: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==0 ){.    /* 
9120: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
9130: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
9140: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
9150: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
9160: 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77  .    ** 'BLOB' w
9170: 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 73 69  ith a default si
9180: 7a 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20 2a  ze of 4 bytes. *
9190: 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  /.    pCol->affi
91a0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
91b0: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c  F_BLOB;.    pCol
91c0: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66  ->szEst = 1;.#if
91d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
91e0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
91f0: 43 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d 73  CES.    if( 4>=s
9200: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9210: 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29  ig.szSorterRef )
9220: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  {.      pCol->co
9230: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
9240: 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20  G_SORTERREF;.   
9250: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
9260: 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a  e{.    zType = z
9270: 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
9280: 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d  30(z) + 1;.    m
9290: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79  emcpy(zType, pTy
92a0: 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29  pe->z, pType->n)
92b0: 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70  ;.    zType[pTyp
92c0: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73  e->n] = 0;.    s
92d0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54  qlite3Dequote(zT
92e0: 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ype);.    pCol->
92f0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9300: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
9310: 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  Type, pCol);.   
9320: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
9330: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
9340: 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f  PE;.  }.  p->nCo
9350: 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  l++;.  pParse->c
9360: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
9370: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
9380: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9390: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
93a0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
93b0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
93c0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
93d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
93e0: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
93f0: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
9400: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
9410: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
9420: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
9430: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
9440: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
9450: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9460: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9470: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
9480: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
9490: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
94a0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
94b0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20  lumn *pCol;.  p 
94c0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
94d0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
94e0: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
94f0: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
9500: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
9510: 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43  p->nCol-1];.  pC
9520: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  ol->notNull = (u
9530: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e  8)onError;.  p->
9540: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9550: 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a  asNotNull;..  /*
9560: 20 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f 74   Set the uniqNot
9570: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79  Null flag on any
9580: 20 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69 6e   UNIQUE or PK in
9590: 64 65 78 65 73 20 61 6c 72 65 61 64 79 20 63 72  dexes already cr
95a0: 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  eated.  ** on th
95b0: 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20  is column.  */. 
95c0: 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c   if( pCol->colFl
95d0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e  ags & COLFLAG_UN
95e0: 49 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64 65  IQUE ){.    Inde
95f0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
9600: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9610: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9620: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9630: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b  assert( pIdx->nK
9640: 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78  eyCol==1 && pIdx
9650: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
9660: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
9670: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
9680: 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a  ]==p->nCol-1 ){.
9690: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e          pIdx->un
96a0: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
96b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
96c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
96d0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
96e0: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
96f0: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
9700: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
9710: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
9720: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
9730: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
9740: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
9750: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
9760: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
9770: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
9780: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
9790: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
97a0: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
97b0: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
97c0: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
97d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
97e0: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
97f0: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
9800: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
9810: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
9820: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
9830: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
9840: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
9850: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
9860: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
9870: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
9880: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
9890: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
98a0: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
98b0: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98d0: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
98e0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
98f0: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
9900: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
9910: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
9920: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
9930: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9940: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
9950: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9960: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
9970: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9980: 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27  F_BLOB.** 'REAL'
9990: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
99a0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
99b0: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
99c0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
99d0: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
99e0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
99f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
9a00: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
9a10: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
9a20: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
9a30: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
9a40: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
9a50: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
9a60: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
9a70: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f  st char *zIn, Co
9a80: 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75  lumn *pCol){.  u
9a90: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
9aa0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9ab0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
9ac0: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
9ad0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   0;..  assert( z
9ae0: 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  In!=0 );.  while
9af0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
9b00: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
9b10: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
9b20: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
9b30: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
9b40: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
9b50: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
9b60: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
9b70: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
9b80: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9b90: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9ba0: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
9bb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9bc0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
9bd0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
9be0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
9bf0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
9c00: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9c10: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9c20: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
9c30: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
9c40: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9c50: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
9c60: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9c70: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9c80: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9c90: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
9ca0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
9cc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
9cd0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9ce0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
9cf0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
9d00: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
9d10: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
9d20: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
9d30: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
9d40: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
9d50: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
9d60: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
9d70: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
9d80: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
9d90: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
9da0: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
9db0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
9dc0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9dd0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
9de0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
9df0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
9e00: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
9e10: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9e20: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
9e30: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
9e40: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9e50: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9e60: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9e70: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9e80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9e90: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
9ea0: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
9eb0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
9ec0: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
9ed0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9ee0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9ef0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9f00: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
9f10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
9f20: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
9f30: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
9f40: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
9f50: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
9f60: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
9f70: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
9f80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
9f90: 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73 20    /* If pCol is 
9fa0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
9fb0: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
9fc0: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
9fd0: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
9fe0: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
9ff0: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
a000: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
a010: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20    */.  if( pCol 
a020: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 30  ){.    int v = 0
a030: 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73  ;   /* default s
a040: 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20  ize is approx 4 
a050: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28  bytes */.    if(
a060: 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f   aff<SQLITE_AFF_
a070: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
a080: 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20   if( zChar ){.  
a090: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68        while( zCh
a0a0: 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ar[0] ){.       
a0b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
a0c0: 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20  digit(zChar[0]) 
a0d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
a0e0: 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48  * BLOB(k), VARCH
a0f0: 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d  AR(k), CHAR(k) -
a100: 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20  > r=(k/4+1) */. 
a110: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a120: 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72  e3GetInt32(zChar
a130: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
a140: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a150: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a160: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
a170: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a180: 20 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b 20          v = 16; 
a190: 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c    /* BLOB, TEXT,
a1a0: 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61   CLOB -> r=5  (a
a1b0: 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a  pprox 20 bytes)*
a1c0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
a1d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a1e0: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
a1f0: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 76  RENCES.    if( v
a200: 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  >=sqlite3GlobalC
a210: 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65  onfig.szSorterRe
a220: 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  f ){.      pCol-
a230: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
a240: 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a  FLAG_SORTERREF;.
a250: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a260: 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20   v = v/4 + 1;.  
a270: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
a280: 3d 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d  = 255;.    pCol-
a290: 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a  >szEst = v;.  }.
a2a0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
a2b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
a2c0: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
a2d0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
a2e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
a2f0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
a300: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
a310: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
a320: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
a330: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
a340: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
a350: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
a360: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
a370: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
a380: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
a390: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a3a0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
a3b0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
a3c0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
a3d0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
a3e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
a3f0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
a400: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
a410: 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lue(.  Parse *pP
a420: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
a430: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
a450: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
a460: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 65   /* The parsed e
a470: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
a480: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   default value *
a490: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a4a0: 7a 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a 20  zStart,      /* 
a4b0: 53 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 66  Start of the def
a4c0: 61 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74 20  ault value text 
a4d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
a4e0: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f 2a  *zEnd         /*
a4f0: 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65 72   First character
a500: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65 66   past end of def
a510: 61 75 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a  aut value text *
a520: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
a530: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
a540: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a550: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
a560: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a570: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30  able;.  if( p!=0
a580: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
a590: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
a5a0: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
a5b0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a5c0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
a5d0: 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62  Expr, db->init.b
a5e0: 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  usy) ){.      sq
a5f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a600: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
a610: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
a620: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
a630: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
a640: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
a650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a660: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70  * A copy of pExp
a670: 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  r is used instea
a680: 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d of the origina
a690: 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74  l, as pExpr cont
a6a0: 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ains.      ** to
a6b0: 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20  kens that point 
a6c0: 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f  to volatile memo
a6d0: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
a6e0: 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20     Expr x;.     
a6f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a700: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
a710: 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lt);.      memse
a720: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
a730: 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20  x));.      x.op 
a740: 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20  = TK_SPAN;.     
a750: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71   x.u.zToken = sq
a760: 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64  lite3DbSpanDup(d
a770: 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29  b, zStart, zEnd)
a780: 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20  ;.      x.pLeft 
a790: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78  = pExpr;.      x
a7a0: 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70  .flags = EP_Skip
a7b0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44  ;.      pCol->pD
a7c0: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  flt = sqlite3Exp
a7d0: 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50  rDup(db, &x, EXP
a7e0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
a7f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a800: 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e  e(db, x.u.zToken
a810: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
a820: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
a830: 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
a840: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
a850: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
a860: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
a870: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
a880: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  xpr);.}../*.** B
a890: 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69  ackwards Compati
a8a0: 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20  bility Hack:.** 
a8b0: 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76  .** Historical v
a8c0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
a8d0: 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e  e accepted strin
a8e0: 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  gs as column nam
a8f0: 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73  es in.** indexes
a900: 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59   and PRIMARY KEY
a910: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64   constraints and
a920: 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   in UNIQUE const
a930: 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65  raints.  Example
a940: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
a950: 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62  TE TABLE xyz(a,b
a960: 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b  ,c,d,e,PRIMARY K
a970: 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27  EY('a'),UNIQUE('
a980: 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74  b','c' COLLATE t
a990: 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41  rim).**     CREA
a9a0: 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20  TE INDEX abc ON 
a9b0: 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43  xyz('c','d' DESC
a9c0: 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  ,'e' COLLATE noc
a9d0: 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a  ase DESC);.**.**
a9e0: 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20   This is goofy. 
a9f0: 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65   But to preserve
aa00: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
aa10: 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74  tibility we cont
aa20: 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70  inue to.** accep
aa30: 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  t it.  This rout
aa40: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63  ine does the nec
aa50: 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f  essary conversio
aa60: 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a  n.  It converts.
aa70: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
aa80: 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61  n given in its a
aa90: 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54  rgument from a T
aaa0: 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20  K_STRING into a 
aab0: 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20  TK_ID.** if the 
aac0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75  expression is ju
aad0: 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77  st a TK_STRING w
aae0: 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ith an optional 
aaf0: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a  COLLATE clause..
ab00: 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65 73  ** If the epxres
ab10: 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67  sion is anything
ab20: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53   other than TK_S
ab30: 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65  TRING, the expre
ab40: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68  ssion is.** unch
ab50: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
ab60: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72   void sqlite3Str
ab70: 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29  ingToId(Expr *p)
ab80: 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  {.  if( p->op==T
ab90: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
aba0: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  p->op = TK_ID;. 
abb0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
abc0: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
abd0: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
abe0: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70  _STRING ){.    p
abf0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b  ->pLeft->op = TK
ac00: 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _ID;.  }.}../*.*
ac10: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
ac20: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
ac30: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
ac40: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
ac50: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
ac60: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
ac70: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
ac80: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
ac90: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
aca0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
acb0: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
acc0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
acd0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
ace0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
acf0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
ad00: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
ad10: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
ad20: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
ad30: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
ad40: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
ad50: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
ad60: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
ad70: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
ad80: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
ad90: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
ada0: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
adb0: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
adc0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
add0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
ade0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
adf0: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
ae00: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
ae10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
ae20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
ae30: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
ae40: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
ae50: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
ae60: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
ae70: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
ae80: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
ae90: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
aea0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
aeb0: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
aec0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
aed0: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
aee0: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
aef0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
af00: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
af10: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
af20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
af30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
af40: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
af50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
af60: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
af70: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
af80: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
af90: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
afa0: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
afb0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
afc0: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
afd0: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
afe0: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
aff0: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
b000: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
b010: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
b020: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
b030: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
b040: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
b050: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
b060: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
b070: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
b080: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
b090: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f  >pNewTable;.  Co
b0a0: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
b0b0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
b0c0: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   i;.  int nTerm;
b0d0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
b0e0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
b0f0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
b100: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
b110: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
b120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b130: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
b140: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
b150: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
b160: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
b170: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
b180: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
b190: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
b1a0: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
b1b0: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
b1c0: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
b1d0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
b1e0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
b1f0: 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   1;.    pCol = &
b200: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b210: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
b220: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
b230: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65  PRIMKEY;.    nTe
b240: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
b250: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
b260: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
b270: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
b280: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
b290: 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69  r *pCExpr = sqli
b2a0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
b2b0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
b2c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73  Expr);.      ass
b2d0: 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29  ert( pCExpr!=0 )
b2e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
b2f0: 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72  tringToId(pCExpr
b300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45  );.      if( pCE
b310: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
b320: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
b330: 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70  char *zCName = p
b340: 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  CExpr->u.zToken;
b350: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
b360: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
b370: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
b380: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
b390: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61  ite3StrICmp(zCNa
b3a0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
b3b0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
b3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
b3d0: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
b3e0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
b3f0: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
b400: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
b410: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
b420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b430: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
b440: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b450: 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31  }.  if( nTerm==1
b460: 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26  .   && pCol.   &
b470: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
b480: 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79  (sqlite3ColumnTy
b490: 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e  pe(pCol,""), "IN
b4a0: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26  TEGER")==0.   &&
b4b0: 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49   sortOrder!=SQLI
b4c0: 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a  TE_SO_DESC.  ){.
b4d0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
b4e0: 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73  E_OBJECT && pLis
b4f0: 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
b500: 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *pCExpr = sqlite
b510: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
b520: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  (pList->a[0].pEx
b530: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
b540: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
b550: 61 70 28 70 50 61 72 73 65 2c 20 26 70 54 61 62  ap(pParse, &pTab
b560: 2d 3e 69 50 4b 65 79 2c 20 70 43 45 78 70 72 29  ->iPKey, pCExpr)
b570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
b580: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
b590: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
b5a0: 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  f = (u8)onError;
b5b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74  .    assert( aut
b5c0: 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49  oInc==0 || autoI
b5d0: 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  nc==1 );.    pTa
b5e0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61  b->tabFlags |= a
b5f0: 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e  utoInc*TF_Autoin
b600: 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28  crement;.    if(
b610: 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d   pList ) pParse-
b620: 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20  >iPkSortOrder = 
b630: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
b640: 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69  Order;.  }else i
b650: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
b660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b670: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
b680: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b690: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
b6a0: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
b6b0: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
b6c0: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
b6d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
b6e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
b6f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
b700: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
b710: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
b720: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20   onError, 0,.   
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f          0, sortO
b750: 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f  rder, 0, SQLITE_
b760: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
b770: 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  EY);.    pList =
b780: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
b790: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
b7a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
b7b0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
b7c0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
b7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
b7e0: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
b7f0: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
b800: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
b810: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
b820: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
b830: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
b840: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
b850: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
b860: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
b870: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
b880: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
b890: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
b8a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b8b0: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
b8c0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
b8d0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71  >pNewTable;.  sq
b8e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b8f0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54  se->db;.  if( pT
b900: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
b910: 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71  E_VTAB.   && !sq
b920: 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
b930: 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d  only(db->aDb[db-
b940: 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a  >init.iDb].pBt).
b950: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70    ){.    pTab->p
b960: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
b970: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
b980: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
b990: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
b9a0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
b9b0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
b9c0: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
b9d0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
b9e0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
b9f0: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
ba00: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
ba10: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
ba20: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
ba30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
ba40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
ba50: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
ba60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ba70: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
ba80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
ba90: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
baa0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
bab0: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
bac0: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
bad0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
bae0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
baf0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
bb00: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
bb10: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
bb20: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
bb30: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
bb40: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
bb50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
bb60: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
bb70: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
bb80: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
bb90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
bba0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
bbb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
bbc0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
bbd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
bbe0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
bbf0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
bc00: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
bc10: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
bc20: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
bc30: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
bc40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
bc50: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e(db, p->aCol[i]
bc60: 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  .zColl);.    p->
bc70: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
bc80: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
bc90: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
bca0: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
bcb0: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
bcc0: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
bcd0: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
bce0: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
bcf0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
bd00: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
bd10: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
bd20: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
bd30: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
bd40: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
bd50: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
bd60: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
bd70: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
bd80: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
bd90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bda0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
bdb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
bdc0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
bdd0: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
bde0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
bdf0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
be00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
be20: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
be30: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
be40: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
be50: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
be60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
be70: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
be80: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
be90: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
bea0: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
beb0: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
bec0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
bed0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
bee0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
bef0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
bf00: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
bf10: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
bf20: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
bf30: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
bf40: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
bf50: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
bf60: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
bf70: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
bf80: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
bf90: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
bfa0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
bfb0: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
bfc0: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
bfd0: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
bfe0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
bff0: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
c000: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
c010: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
c020: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
c030: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
c040: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
c050: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
c060: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
c070: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
c080: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
c090: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
c0a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c0b0: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
c0c0: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
c0d0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
c0e0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
c0f0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
c100: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
c110: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
c120: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
c130: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
c140: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
c150: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
c160: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
c170: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
c180: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
c190: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
c1a0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
c1b0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
c1c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
c1d0: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
c1e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c1f0: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
c200: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
c210: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
c220: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
c230: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
c240: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
c250: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
c260: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
c270: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
c280: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
c290: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
c2a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c2b0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
c2c0: 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20  se, enc, pColl, 
c2d0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  zName);.  }..  r
c2e0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
c2f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c300: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
c310: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
c320: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
c330: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
c340: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
c350: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
c360: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
c370: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
c380: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
c390: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
c3a0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
c3b0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
c3c0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
c3d0: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
c3e0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
c3f0: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
c400: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
c410: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
c420: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
c430: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
c440: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
c450: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
c460: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
c470: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
c480: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
c490: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
c4a0: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
c4b0: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
c4c0: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
c4d0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
c4e0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
c4f0: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
c500: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
c510: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
c520: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
c530: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
c540: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
c550: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
c560: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
c570: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
c580: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
c590: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
c5a0: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
c5b0: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
c5c0: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
c5d0: 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d  ION-OF: R-34230-
c5e0: 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75 74  56049 SQLite aut
c5f0: 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65  omatically incre
c600: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68  ments.** the sch
c610: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e  ema-version when
c620: 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61 20  ever the schema 
c630: 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  changes..*/.void
c640: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
c650: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
c660: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
c670: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c680: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
c690: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c6a0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
c6b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
c6c0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
c6d0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
c6e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
c6f0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
c700: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
c710: 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ION, .          
c720: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 31           (int)(1
c730: 2b 28 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61  +(unsigned)db->a
c740: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
c750: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29  >schema_cookie))
c760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
c770: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
c780: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
c790: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
c7a0: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
c7b0: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
c7c0: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
c7d0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
c7e0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
c7f0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
c800: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
c810: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
c820: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
c830: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
c840: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
c850: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
c860: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
c870: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
c880: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
c890: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
c8a0: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
c8b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
c8c0: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
c8d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
c8e0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
c8f0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
c900: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c910: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
c920: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
c930: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
c940: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
c950: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
c960: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
c970: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
c980: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
c990: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
c9a0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
c9b0: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
c9c0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
c9d0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
c9e0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
c9f0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
ca00: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
ca10: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
ca20: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
ca30: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
ca40: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
ca50: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
ca60: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
ca70: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
ca80: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
ca90: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
caa0: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
cab0: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
cac0: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
cad0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
cae0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
caf0: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
cb00: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
cb10: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
cb20: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
cb30: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
cb40: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
cb50: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
cb60: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
cb70: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
cb80: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
cb90: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
cba0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
cbb0: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
cbc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
cbd0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
cbe0: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
cbf0: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
cc00: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
cc10: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
cc20: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
cc30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
cc40: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
cc50: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
cc60: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
cc70: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
cc80: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
cc90: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
cca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
ccb0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
ccc0: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
ccd0: 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  K_ID.           
cce0: 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   || zIdent[j]!=0
ccf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
cd00: 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65  j==0;..  if( nee
cd10: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
cd20: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
cd30: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
cd40: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
cd50: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
cd60: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
cd70: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
cd80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
cd90: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
cda0: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
cdb0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
cdc0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
cdd0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
cde0: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
cdf0: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
ce00: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
ce10: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
ce20: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
ce30: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
ce40: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
ce50: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
ce60: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
ce70: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
ce80: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
ce90: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
cea0: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
ceb0: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
cec0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
ced0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
cee0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
cef0: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
cf00: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
cf10: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
cf20: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
cf30: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
cf40: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
cf50: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
cf60: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
cf70: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
cf80: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
cf90: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
cfa0: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
cfb0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
cfc0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
cfd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
cfe0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
cff0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
d000: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
d010: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
d020: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
d030: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
d040: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
d050: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
d060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
d070: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
d080: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
d090: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d0a0: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
d0b0: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
d0c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d0d0: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
d0e0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
d0f0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
d100: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
d110: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
d120: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
d130: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
d140: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
d150: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
d160: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
d170: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
d180: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
d190: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
d1a0: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
d1b0: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
d1c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d1d0: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
d1e0: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
d1f0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
d200: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
d210: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
d220: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
d230: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
d240: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
d250: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
d260: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
d270: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
d280: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
d290: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
d2a0: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
d2b0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
d2c0: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
d2d0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
d2e0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
d2f0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
d300: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
d310: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
d320: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
d330: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
d340: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
d350: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
d360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
d370: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
d380: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
d390: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d3a0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d3b0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
d3c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
d3d0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
d3e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
d3f0: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
d400: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
d410: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
d420: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
d430: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
d440: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d450: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
d460: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
d470: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
d480: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
d490: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
d4a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d4b0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
d4c0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
d4d0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
d4e0: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
d4f0: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
d500: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
d510: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
d520: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
d530: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
d540: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
d550: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
d560: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
d570: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
d580: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
d590: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
d5a0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
d5b0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
d5c0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
d5d0: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
d5e0: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
d5f0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
d600: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
d610: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
d620: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
d630: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
d640: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
d650: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
d660: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
d670: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
d680: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
d690: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
d6a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d6b0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
d6c0: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
d6d0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
d6e0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
d6f0: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
d700: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
d710: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
d720: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
d730: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
d740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d750: 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70  EM_BKPT;.  memcp
d760: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
d770: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
d780: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
d790: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
d7a0: 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
d7b0: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
d7c0: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
d7d0: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
d7e0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
d7f0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
d800: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
d810: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
d820: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
d830: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
d840: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
d850: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
d860: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
d870: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
d880: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
d890: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
d8a0: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
d8b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
d8c0: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
d8d0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
d8e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d8f0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
d900: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
d910: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
d920: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
d930: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
d940: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
d950: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
d960: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
d970: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
d980: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
d990: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
d9a0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
d9b0: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
d9c0: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
d9d0: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
d9e0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
d9f0: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
da00: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
da10: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
da20: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
da30: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
da40: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
da50: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
da60: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
da70: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
da80: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
da90: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
daa0: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
dab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
dac0: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
dad0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
dae0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
daf0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
db00: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
db10: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
db20: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
db30: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
db40: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
db50: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
db60: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
db70: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
db80: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
db90: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
dba0: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
dbb0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
dbc0: 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73  ue if value x is
dbd0: 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68   found any of th
dbe0: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
dbf0: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a  ries of aiCol[].
dc00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
dc10: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
dc20: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
dc30: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
dc40: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
dc50: 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c  ) if( x==*(aiCol
dc60: 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ++) ) return 1;.
dc70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
dc80: 2a 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20  * Recompute the 
dc90: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 66 69 65 6c  colNotIdxed fiel
dca0: 64 20 6f 66 20 74 68 65 20 49 6e 64 65 78 2e 0a  d of the Index..
dcb0: 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65  **.** colNotIdxe
dcc0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  d is a bitmask t
dcd0: 68 61 74 20 68 61 73 20 61 20 30 20 62 69 74 20  hat has a 0 bit 
dce0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 65 61 63  representing eac
dcf0: 68 20 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c  h indexed.** col
dd00: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 77 69  umns that are wi
dd10: 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 36  thin the first 6
dd20: 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  3 columns of the
dd30: 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20   table.  The.** 
dd40: 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f  high-order bit o
dd50: 66 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73  f colNotIdxed is
dd60: 20 61 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c 20   always 1.  All 
dd70: 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  unindexed column
dd80: 73 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  s.** of the tabl
dd90: 65 20 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a  e have a 1..**.*
dda0: 2a 20 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65  * The colNotIdxe
ddb0: 64 20 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64  d mask is AND-ed
ddc0: 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
ddd0: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61  t.a[].colUsed ma
dde0: 73 6b 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  sk.** to determi
ddf0: 6e 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ne if the index 
de00: 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
de10: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
de20: 64 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d  d recomputeColum
de30: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64  nsNotIndexed(Ind
de40: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
de50: 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
de60: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
de70: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
de80: 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
de90: 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
dea0: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
deb0: 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
dec0: 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
ded0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
dee0: 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
def0: 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
df00: 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
df10: 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
df20: 20 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64    pIdx->colNotId
df30: 78 65 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65  xed = ~m;.  asse
df40: 72 74 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f  rt( (pIdx->colNo
df50: 74 49 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29  tIdxed>>63)==1 )
df60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
df70: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20  routine runs at 
df80: 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69  the end of parsi
df90: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
dfa0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
dfb0: 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55  .** has a WITHOU
dfc0: 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20  T ROWID clause. 
dfd0: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
dfe0: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63   routine is to c
dff0: 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69  onvert both.** i
e000: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
e010: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
e020: 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  nd the generated
e030: 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68   VDBE code so th
e040: 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61  at they.** are a
e050: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61  ppropriate for a
e060: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
e070: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
e080: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a  a rowid table..*
e090: 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64  * Changes includ
e0a0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
e0b0: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
e0c0: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
e0d0: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
e0e0: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
e0f0: 4c 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43  L..**     (2)  C
e100: 6f 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d 65  onvert P3 parame
e110: 74 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72  ter of the OP_Cr
e120: 65 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42  eateBtree from B
e130: 54 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20  TREE_INTKEY .** 
e140: 20 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54           into BT
e150: 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20  REE_BLOBKEY..** 
e160: 20 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20      (3)  Bypass 
e170: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
e180: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e190: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a  r table entry.**
e1a0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68            for th
e1b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73  e PRIMARY KEY as
e1c0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e1d0: 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a   index is now.**
e1e0: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
e1f0: 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  fied by the sqli
e200: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e210: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
e220: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20  le itself..**   
e230: 20 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49    (4)  Set the I
e240: 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65  ndex.tnum of the
e250: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
e260: 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ex object in the
e270: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68  .**          sch
e280: 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70  ema to the rootp
e290: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  age from the mai
e2a0: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  n table..**     
e2b0: 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62  (5)  Add all tab
e2c0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
e2d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
e2e0: 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20  dex object.**   
e2f0: 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74         so that t
e300: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
e310: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
e320: 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73  ex.  The surplus
e330: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .**          col
e340: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
e350: 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65   KeyInfo.nAllFie
e360: 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75  ld and are not u
e370: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  sed for.**      
e380: 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c      sorting or l
e390: 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e  ookup or uniquen
e3a0: 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20  ess checks..**  
e3b0: 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20     (6)  Replace 
e3c0: 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f  the rowid tail o
e3d0: 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61  n all automatica
e3e0: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e  lly generated UN
e3f0: 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  IQUE.**         
e400: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68   indices with th
e410: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
e420: 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  lumns..**.** For
e430: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c   virtual tables,
e440: 20 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72   only (1) is per
e450: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
e460: 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f  c void convertTo
e470: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
e480: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
e490: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
e4a0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
e4b0: 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e  Index *pPk;.  in
e4c0: 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20  t nPk;.  int i, 
e4d0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
e4e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e4f0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
e500: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20  e->pVdbe;..  /* 
e510: 4d 61 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41  Mark every PRIMA
e520: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73  RY KEY column as
e530: 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70   NOT NULL (excep
e540: 74 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74  t for imposter t
e550: 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66  ables).  */.  if
e560: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f  ( !db->init.impo
e570: 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20  sterTable ){.   
e580: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
e590: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
e5a0: 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61      if( (pTab->a
e5b0: 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20  Col[i].colFlags 
e5c0: 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
e5d0: 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
e5e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e   pTab->aCol[i].n
e5f0: 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72  otNull = OE_Abor
e600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
e610: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
e620: 72 74 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  rt the P3 operan
e630: 64 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61  d of the OP_Crea
e640: 74 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20 66  teBtree opcode f
e650: 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  rom BTREE_INTKEY
e660: 0a 20 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45  .  ** into BTREE
e670: 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20  _BLOBKEY..  */. 
e680: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
e690: 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73  rCrTab ){.    as
e6a0: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73  sert( v );.    s
e6b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e6c0: 50 33 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64  P3(v, pParse->ad
e6d0: 64 72 43 72 54 61 62 2c 20 42 54 52 45 45 5f 42  drCrTab, BTREE_B
e6e0: 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20  LOBKEY);.  }..  
e6f0: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
e700: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
e710: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
e720: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
e730: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
e740: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
e750: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
e760: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
e770: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
e780: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
e790: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
e7a0: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b   *pList;.    Tok
e7b0: 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20  en ipkToken;.   
e7c0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
e7d0: 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61  t(&ipkToken, pTa
e7e0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
e7f0: 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
e800: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
e810: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
e820: 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20  Parse, 0, .     
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e840: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
e850: 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b  , TK_ID, &ipkTok
e860: 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  en, 0));.    if(
e870: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
e880: 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  rn;.    pList->a
e890: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
e8a0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
e8b0: 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rder;.    assert
e8c0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
e8d0: 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
e8e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
e8f0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
e900: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62  , 0, pList, pTab
e910: 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c  ->keyConf, 0, 0,
e920: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
e940: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
e950: 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66  MARYKEY);.    if
e960: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e970: 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
e980: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rr ) return;.   
e990: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
e9a0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
e9b0: 61 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  ab);.    pTab->i
e9c0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  PKey = -1;.  }el
e9d0: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
e9e0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e9f0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
ea00: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
ea10: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
ea20: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75   Remove all redu
ea30: 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72  ndant columns fr
ea40: 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  om the PRIMARY K
ea50: 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  EY.  For example
ea60: 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  , change.    ** 
ea70: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
ea80: 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69  ,a,b,c,b,c,d)" i
ea90: 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52  nto just "PRIMAR
eaa0: 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e  Y KEY(a,b,c,d)".
eab0: 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63    Later.    ** c
eac0: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20  ode assumes the 
ead0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74  PRIMARY KEY cont
eae0: 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64  ains no repeated
eaf0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f   columns..    */
eb00: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20  .    for(i=j=1; 
eb10: 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  i<pPk->nKeyCol; 
eb20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
eb30: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
eb40: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d  iColumn, j, pPk-
eb50: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
eb60: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43  .        pPk->nC
eb70: 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d  olumn--;.      }
eb80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
eb90: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d  k->aiColumn[j++]
eba0: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
ebb0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
ebc0: 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79   }.    pPk->nKey
ebd0: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61  Col = j;.  }.  a
ebe0: 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b  ssert( pPk!=0 );
ebf0: 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69  .  pPk->isCoveri
ec00: 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64  ng = 1;.  if( !d
ec10: 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
ec20: 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69  Table ) pPk->uni
ec30: 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  qNotNull = 1;.  
ec40: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
ec50: 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73  ol;..  /* Bypass
ec60: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
ec70: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ec80: 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
ec90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
eca0: 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54  * table entry. T
ecb0: 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  his is only requ
ecc0: 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c  ired if currentl
ecd0: 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42  y generating VDB
ece0: 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20  E.  ** code for 
ecf0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28  a CREATE TABLE (
ed00: 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67  not when parsing
ed10: 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20   one as part of 
ed20: 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64  reading.  ** a d
ed30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e  atabase schema).
ed40: 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20    */.  if( v && 
ed50: 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20  pPk->tnum>0 ){. 
ed60: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
ed70: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
ed80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ed90: 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50  angeOpcode(v, pP
eda0: 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f  k->tnum, OP_Goto
edb0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
edc0: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
edd0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
ede0: 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20   the table root 
edf0: 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74  page */.  pPk->t
ee00: 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  num = pTab->tnum
ee10: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
ee20: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
ee30: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
ee40: 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
ee50: 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
ee60: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
ee70: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
ee80: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
ee90: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
eea0: 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
eeb0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
eec0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
eed0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
eee0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
eef0: 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  f( IsPrimaryKeyI
ef00: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
ef10: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
ef20: 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
ef30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
ef40: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
ef50: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
ef60: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
ef70: 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a  lumn[i]) ) n++;.
ef80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d      }.    if( n=
ef90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
efa0: 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73  his index is a s
efb0: 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70  uperset of the p
efc0: 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
efd0: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
efe0: 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  n = pIdx->nKeyCo
eff0: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
f000: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
f010: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
f020: 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64  ct(db, pIdx, pId
f030: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20  x->nKeyCol+n) ) 
f040: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
f050: 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65  i=0, j=pIdx->nKe
f060: 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  yCol; i<nPk; i++
f070: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
f080: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
f090: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
f0a0: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
f0b0: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
f0c0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
f0d0: 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  mn[j] = pPk->aiC
f0e0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
f0f0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a    pIdx->azColl[j
f100: 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
f110: 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  i];.        j++;
f120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f130: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
f140: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e  >nColumn>=pIdx->
f150: 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20  nKeyCol+n );.   
f160: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
f170: 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d  Column>=j );.  }
f180: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74  ..  /* Add all t
f190: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
f1a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
f1b0: 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28  index.  */.  if(
f1c0: 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20   nPk<pTab->nCol 
f1d0: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a  ){.    if( resiz
f1e0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
f1f0: 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c   pPk, pTab->nCol
f200: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
f210: 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20  for(i=0, j=nPk; 
f220: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
f230: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
f240: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
f250: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b  Column, j, i) ){
f260: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f270: 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20   j<pPk->nColumn 
f280: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  );.        pPk->
f290: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b  aiColumn[j] = i;
f2a0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a  .        pPk->az
f2b0: 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65  Coll[j] = sqlite
f2c0: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
f2d0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
f2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
f2f0: 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d  t( pPk->nColumn=
f300: 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =j );.    assert
f310: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20  ( pTab->nCol==j 
f320: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f330: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  pPk->nColumn = p
f340: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  Tab->nCol;.  }. 
f350: 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   recomputeColumn
f360: 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29  sNotIndexed(pPk)
f370: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
f380: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f390: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TABLE./*.** Retu
f3a0: 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61 6d 65  rn true if zName
f3b0: 20 69 73 20 61 20 73 68 61 64 6f 77 20 74 61 62   is a shadow tab
f3c0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 63  le name in the c
f3d0: 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 0a  urrent database.
f3e0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
f3f0: 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65  *.** zName is te
f400: 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66 69  mporarily modifi
f410: 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f  ed while this ro
f420: 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67  utine is running
f430: 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65 73 74  , but is.** rest
f440: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
f450: 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69 6f 72  inal value prior
f460: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
f470: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
f480: 74 61 74 69 63 20 69 6e 74 20 69 73 53 68 61 64  tatic int isShad
f490: 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69  owTableName(sqli
f4a0: 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a  te3 *db, char *z
f4b0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
f4c0: 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Tail;           
f4d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
f4e0: 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 22 5f  r to the last "_
f4f0: 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  " in zName */.  
f500: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f520: 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d   Table that zNam
f530: 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 6f 66  e is a shadow of
f540: 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d   */.  Module *pM
f550: 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  od;             
f560: 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f      /* Module fo
f570: 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
f580: 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20  ble */..  zTail 
f590: 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d 65 2c  = strrchr(zName,
f5a0: 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54 61   '_');.  if( zTa
f5b0: 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  il==0 ) return 0
f5c0: 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  ;.  *zTail = 0;.
f5d0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
f5e0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
f5f0: 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61 69  ame, 0);.  *zTai
f600: 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20 70  l = '_';.  if( p
f610: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
f620: 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69 72 74  0;.  if( !IsVirt
f630: 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
f640: 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20 28  rn 0;.  pMod = (
f650: 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48  Module*)sqlite3H
f660: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f  ashFind(&db->aMo
f670: 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f  dule, pTab->azMo
f680: 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20 69  duleArg[0]);.  i
f690: 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65 74  f( pMod==0 ) ret
f6a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f  urn 0;.  if( pMo
f6b0: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65 72  d->pModule->iVer
f6c0: 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e 20  sion<3 ) return 
f6d0: 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  0;.  if( pMod->p
f6e0: 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e  Module->xShadowN
f6f0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
f700: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f 64  0;.  return pMod
f710: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64  ->pModule->xShad
f720: 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b  owName(zTail+1);
f730: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
f740: 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  e isShadowTableN
f750: 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  ame(x,y) 0.#endi
f760: 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
f770: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
f780: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ABLE */../*.** T
f790: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f7a0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
f7b0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
f7c0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
f7d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
f7e0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
f7f0: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
f800: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
f810: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
f820: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
f830: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
f840: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
f850: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
f860: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
f870: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
f880: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
f890: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
f8a0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
f8b0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
f8c0: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
f8d0: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
f8e0: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
f8f0: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
f900: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
f910: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
f920: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
f930: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f940: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
f950: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
f960: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
f970: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
f980: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f990: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
f9a0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
f9b0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
f9c0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
f9d0: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
f9e0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
f9f0: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
fa00: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
fa10: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
fa20: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
fa30: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
fa40: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
fa50: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
fa60: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
fa70: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
fa80: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
fa90: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
faa0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
fab0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
fac0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
fad0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
fae0: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
faf0: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
fb00: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
fb10: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
fb20: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
fb30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
fb40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
fb50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
fb60: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
fb70: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
fb80: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
fb90: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
fba0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
fbb0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
fbc0: 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20   The ')' before 
fbd0: 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43  options in the C
fbe0: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
fbf0: 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20   u8 tabOpts,    
fc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
fc10: 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e  a table options.
fc20: 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20   Usually 0. */. 
fc30: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
fc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
fc50: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
fc60: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
fc70: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
fc80: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
fc90: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
fca0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
fcb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
fcc0: 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
fcd0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
fce0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd00: 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63  Database in whic
fd10: 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65  h the table live
fd20: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
fd30: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
fd40: 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69   /* An implied i
fd50: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
fd60: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64  e */..  if( pEnd
fd70: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
fd80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
fd90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
fda0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fdb0: 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
fdc0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
fdd0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
fde0: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
fdf0: 3d 3d 30 20 26 26 20 69 73 53 68 61 64 6f 77 54  ==0 && isShadowT
fe00: 61 62 6c 65 4e 61 6d 65 28 64 62 2c 20 70 2d 3e  ableName(db, p->
fe10: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 70 2d  zName) ){.    p-
fe20: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
fe30: 53 68 61 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  Shadow;.  }..  /
fe40: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
fe50: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
fe60: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
fe70: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
fe80: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
fe90: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
fea0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
feb0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
fec0: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
fed0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
fee0: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
fef0: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
ff00: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
ff10: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
ff20: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
ff30: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
ff40: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
ff50: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
ff60: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
ff70: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
ff80: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
ff90: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
ffa0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
ffb0: 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 1, that means
ffc0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71 6c   this is the sql
ffd0: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
ffe0: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53  table itself.  S
fff0: 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f  o mark it read-o
10000 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nly..  */.  if( 
10010 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
10020 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
10030 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10040 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10050 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
10060 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
10070 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
10080 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69  t.newTnum;.    i
10090 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20  f( p->tnum==1 ) 
100a0 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
100b0 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a  F_Readonly;.  }.
100c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 74  .  assert( (p->t
100d0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
100e0 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 0a 20  PrimaryKey)==0. 
100f0 20 20 20 20 20 20 7c 7c 20 70 2d 3e 69 50 4b 65        || p->iPKe
10100 79 3e 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  y>=0 || sqlite3P
10110 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
10120 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
10130 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
10140 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
10150 79 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  y)!=0.       || 
10160 28 70 2d 3e 69 50 4b 65 79 3c 30 20 26 26 20 73  (p->iPKey<0 && s
10170 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
10180 49 6e 64 65 78 28 70 29 3d 3d 30 29 20 29 3b 0a  Index(p)==0) );.
10190 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72  .  /* Special pr
101a0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49 54  ocessing for WIT
101b0 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65  HOUT ROWID Table
101c0 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f 70  s */.  if( tabOp
101d0 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52  ts & TF_WithoutR
101e0 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20  owid ){.    if( 
101f0 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
10200 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
10210 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10220 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10230 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55 54  ,.          "AUT
10240 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61  OINCREMENT not a
10250 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f 55  llowed on WITHOU
10260 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22 29  T ROWID tables")
10270 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
10280 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
10290 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
102a0 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d  HasPrimaryKey)==
102b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
102c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
102d0 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20  e, "PRIMARY KEY 
102e0 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65  missing on table
102f0 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   %s", p->zName);
10300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10310 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d    p->tabFlags |=
10320 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
10330 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
10340 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76  owid;.      conv
10350 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
10360 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
10370 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10380 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
10390 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
103a0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
103b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
103c0 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
103d0 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
103e0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
103f0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
10400 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
10410 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eck ){.    sqlit
10420 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
10430 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
10440 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c  , NC_IsCheck, 0,
10450 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d   p->pCheck);.  }
10460 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10470 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10480 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
10490 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
104a0 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f  rage row size fo
104b0 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
104c0 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20  for all implied 
104d0 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74  indices */.  est
104e0 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
104f0 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  p);.  for(pIdx=p
10500 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
10510 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
10520 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49  ){.    estimateI
10530 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b  ndexWidth(pIdx);
10540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
10550 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
10560 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
10570 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
10580 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
10590 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
105a0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
105b0 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
105c0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
105d0 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
105e0 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
105f0 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
10600 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
10610 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
10620 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
10630 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
10640 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
10650 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
10660 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
10670 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
10680 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
10690 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
106a0 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
106b0 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
106c0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
106d0 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
106e0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
106f0 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
10700 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
10710 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
10720 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10730 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
10740 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
10750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10760 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
10770 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20   0);..    /* .  
10780 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
10790 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65  zType for the ne
107a0 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e  w view or table.
107b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
107c0 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
107d0 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
107e0 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
107f0 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
10800 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
10810 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e   = "TABLE";.#ifn
10820 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10830 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VIEW.    }else{.
10840 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
10850 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
10860 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
10870 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
10880 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
10890 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
108a0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
108b0 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
108c0 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
108d0 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
108e0 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
108f0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
10900 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
10910 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
10920 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
10930 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
10940 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
10950 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
10960 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
10970 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
10980 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
10990 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
109a0 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
109b0 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
109c0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
109d0 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
109e0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
109f0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
10a00 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72  **.    ** A shar
10a10 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c  ed-cache write-l
10a20 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ock is not requi
10a30 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  red to write to 
10a40 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20  the new table,. 
10a50 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d     ** as a schem
10a60 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65  a-lock must have
10a70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62   already been ob
10a80 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65  tained to create
10a90 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a   it. Since.    *
10aa0 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  * a schema-lock 
10ab0 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
10ac0 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72  er database user
10ad0 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  s, the write-loc
10ae0 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62  k would.    ** b
10af0 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  e redundant..   
10b00 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
10b10 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ect ){.      Sel
10b20 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
10b30 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53 45   /* Where the SE
10b40 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72  LECT should stor
10b50 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
10b60 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b     int regYield;
10b70 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10b80 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f  er holding co-ro
10b90 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e  utine entry-poin
10ba0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
10bb0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f  ddrTop;        /
10bc0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d  * Top of the co-
10bd0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
10be0 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20   int regRec;    
10bf0 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64       /* A record
10c00 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e   to be insert in
10c10 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
10c20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
10c30 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a  gRowid;       /*
10c40 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   Rowid of the ne
10c50 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74  xt row to insert
10c60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
10c70 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a  drInsLoop;    /*
10c80 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
10c90 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72   for inserting r
10ca0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ows */.      Tab
10cb0 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20  le *pSelTab;    
10cc0 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74   /* A table that
10cd0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 53   describes the S
10ce0 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
10cf0 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c 64  ..      regYield
10d00 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10d10 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20  m;.      regRec 
10d20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
10d30 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
10d40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10d50 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
10d60 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
10d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
10d80 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
10d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10da0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
10db0 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
10dc0 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
10dd0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
10de0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
10df0 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29   OPFLAG_P2ISREG)
10e00 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
10e10 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
10e20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
10e30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10e40 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  (v) + 1;.      s
10e50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10e60 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
10e70 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
10e80 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
10e90 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
10ea0 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
10eb0 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
10ec0 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
10ed0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10ee0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
10ef0 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
10f00 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
10f10 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
10f20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f   );.      p->nCo
10f30 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
10f40 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  l;.      p->aCol
10f50 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
10f60 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
10f70 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
10f80 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
10f90 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
10fa0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
10fb0 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
10fc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
10fd0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
10fe0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
10ff0 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
11000 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11010 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
11020 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
11030 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
11040 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  turn;.      sqli
11050 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
11060 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29  ine(v, regYield)
11070 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11080 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11090 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20  ddrTop - 1);.   
110a0 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
110b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
110c0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
110d0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
110e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
110f0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
11100 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11110 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
11120 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
11130 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
11140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
11150 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
11160 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11180 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
11190 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
111a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
111b0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
111c0 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
111d0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
111e0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
111f0 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
11200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11210 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11220 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
11230 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11240 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
11250 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11260 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
11270 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
11280 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
11290 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
112a0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
112b0 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
112c0 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
112d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
112e0 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
112f0 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
11300 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
11310 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
11320 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
11330 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
11340 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
11350 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
11360 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
11370 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
11380 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11390 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
113a0 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
113b0 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
113c0 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
113d0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
113e0 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
113f0 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
11400 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
11410 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
11420 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
11430 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
11440 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
11450 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
11460 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
11470 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
11480 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
11490 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
114a0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
114b0 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
114c0 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
114d0 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
114e0 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
114f0 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
11500 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
11510 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
11520 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
11530 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
11540 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
11550 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79 70  NAME,.      zTyp
11560 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
11570 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
11580 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
11590 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
115a0 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
115b0 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
115c0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
115d0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
115e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
115f0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
11600 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
11610 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11620 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
11630 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
11640 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
11650 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
11660 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
11670 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
11680 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
11690 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
116a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
116b0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
116c0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
116d0 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
116e0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
116f0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
11700 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11710 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
11720 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28   0) );.      if(
11730 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
11740 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
11750 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
11760 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
11770 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
11780 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
11790 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
117a0 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
117b0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20   pDb->zDbSName. 
117c0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
117d0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
117e0 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
117f0 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
11800 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
11810 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
11820 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
11830 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
11840 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
11850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
11860 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
11870 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
11880 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
11890 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
118a0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
118b0 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
118c0 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
118d0 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
118e0 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
118f0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
11900 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
11910 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
11920 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
11930 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
11940 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11950 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
11960 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
11970 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
11980 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
11990 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
119a0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
119b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
119c0 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
119d0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
119e0 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
119f0 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
11a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
11a10 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
11a20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
11a30 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
11a40 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
11a50 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
11a60 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
11a70 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e;..#ifndef SQLI
11a80 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
11a90 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
11aa0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
11ab0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
11ac0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
11ad0 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
11ae0 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
11af0 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
11b00 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
11b10 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
11b20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
11b30 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
11b40 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
11b50 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
11b60 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
11b70 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
11b80 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
11b90 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
11ba0 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
11bb0 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
11bc0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
11bd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
11be0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11bf0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
11c00 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
11c10 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
11c20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
11c30 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
11c40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
11c50 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
11c60 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
11c70 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
11c80 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
11c90 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
11ca0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
11cb0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
11cc0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11cd0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
11ce0 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
11cf0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
11d00 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
11d10 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
11d20 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
11d30 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
11d40 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11d50 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69  view */.  ExprLi
11d60 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20  st *pCNames, /* 
11d70 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66  Optional list of
11d80 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   view column nam
11d90 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
11da0 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
11db0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11dc0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
11dd0 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
11de0 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
11df0 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
11e00 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
11e10 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
11e20 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
11e30 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
11e40 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
11e50 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
11e60 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
11e70 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
11e80 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
11e90 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
11ea0 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
11eb0 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
11ec0 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
11ed0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11ee0 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
11ef0 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
11f00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11f10 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
11f20 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
11f30 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
11f40 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
11f50 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  view_fail;.  }. 
11f60 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
11f70 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
11f80 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
11f90 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
11fa0 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
11fb0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
11fc0 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
11fd0 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61  nErr ) goto crea
11fe0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
11ff0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
12000 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
12010 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
12020 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
12030 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12040 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
12050 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
12060 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
12070 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
12080 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
12090 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
120a0 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20  Fix, pSelect) ) 
120b0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
120c0 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  _fail;..  /* Mak
120d0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
120e0 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
120f0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
12100 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
12110 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
12120 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
12130 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
12140 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
12150 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
12160 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
12170 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
12180 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
12190 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
121a0 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
121b0 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
121c0 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
121d0 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
121e0 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45    */.  if( IN_RE
121f0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
12200 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20     p->pSelect = 
12210 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65  pSelect;.    pSe
12220 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lect = 0;.  }els
12230 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  e{.    p->pSelec
12240 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
12250 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
12260 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
12270 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65  );.  }.  p->pChe
12280 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
12290 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
122a0 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
122b0 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
122c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
122d0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
122e0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
122f0 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
12300 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
12310 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
12320 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
12330 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
12340 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
12350 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
12360 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
12370 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30  !=0 || sEnd.n==0
12380 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
12390 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
123a0 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
123b0 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
123c0 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
123d0 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
123e0 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
123f0 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
12400 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
12410 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
12420 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
12430 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
12440 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
12450 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
12460 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
12470 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
12480 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
12490 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
124a0 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
124b0 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
124c0 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
124d0 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
124e0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
124f0 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
12500 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
12510 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
12520 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c 69  ite3RenameExprli
12530 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  stUnmap(pParse, 
12540 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20  pCNames);.  }.  
12550 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
12560 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65  elete(db, pCName
12570 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  s);.  return;.}.
12580 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12590 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
125a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
125b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
125c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
125d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
125e0 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
125f0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
12600 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
12610 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
12620 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
12630 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
12640 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
12650 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
12660 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
12670 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
12680 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
12690 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
126a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
126b0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
126c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
126d0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
126e0 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
126f0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
12700 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
12710 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
12720 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
12730 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
12740 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
12750 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
12760 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
12770 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
12780 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
12790 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
127a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
127b0 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
127c0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
127d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
127e0 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
127f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
12800 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
12810 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12820 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
12830 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
12840 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
12850 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64   errors */.#ifnd
12860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12870 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
12880 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  t rc;.#endif.#if
12890 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
128a0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
128b0 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78   sqlite3_xauth x
128c0 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53  Auth;       /* S
128d0 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74  aved xAuth point
128e0 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
128f0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
12900 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
12910 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12920 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d  BLE.  db->nSchem
12930 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20  aLock++;.  rc = 
12940 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
12950 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
12960 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53  Table);.  db->nS
12970 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69  chemaLock--;.  i
12980 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
12990 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
129a0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
129b0 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
129c0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
129d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
129e0 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
129f0 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
12a00 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
12a10 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
12a20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
12a30 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
12a40 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
12a50 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
12a60 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
12a70 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
12a80 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
12a90 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
12aa0 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
12ab0 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
12ac0 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
12ad0 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
12ae0 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
12af0 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
12b00 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
12b10 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
12b20 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
12b30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
12b40 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
12b50 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
12b60 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
12b70 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
12b80 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
12b90 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
12ba0 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72  ctually, the err
12bb0 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20  or above is now 
12bc0 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
12bd0 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
12be0 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  int..  ** But th
12bf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
12c00 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74   is still import
12c10 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63  ant as it does c
12c20 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74  ome up.  ** in t
12c30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
12c40 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  ** .  **     CRE
12c50 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65  ATE TABLE main.e
12c60 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20  x1(a);.  **     
12c70 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57  CREATE TEMP VIEW
12c80 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61   ex1 AS SELECT a
12c90 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20   FROM ex1;.  ** 
12ca0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12cb0 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f  M temp.ex1;.  */
12cc0 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
12cd0 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
12ce0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12cf0 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
12d00 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
12d10 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
12d20 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
12d30 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
12d40 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
12d50 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
12d60 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
12d70 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
12d80 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
12d90 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
12da0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
12db0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
12dc0 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
12dd0 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
12de0 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
12df0 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
12e00 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
12e10 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
12e20 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
12e30 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
12e40 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
12e50 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
12e60 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
12e70 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
12e80 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
12e90 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
12ea0 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
12eb0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
12ec0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
12ed0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
12ee0 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
12ef0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
12f00 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
12f10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
12f20 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
12f30 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
12f40 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66   pSel ){.#ifndef
12f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
12f60 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20 65  ERTABLE.    u8 e
12f70 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61 72  ParseMode = pPar
12f80 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a  se->eParseMode;.
12f90 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72      pParse->ePar
12fa0 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d  seMode = PARSE_M
12fb0 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64  ODE_NORMAL;.#end
12fc0 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  if.    n = pPars
12fd0 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
12fe0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
12ff0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
13000 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
13010 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13020 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
13030 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
13040 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
13050 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
13060 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
13070 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
13080 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
13090 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
130a0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
130b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
130c0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
130d0 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
130e0 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
130f0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
13100 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
13110 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
13120 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
13130 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
13140 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
13150 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
13160 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
13170 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
13180 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
13190 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
131a0 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
131b0 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
131c0 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
131d0 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
131e0 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
131f0 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
13200 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
13210 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
13220 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
13230 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
13240 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
13250 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
13260 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
13270 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
13280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
13290 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
132a0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
132b0 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
132e0 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
132f0 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
13300 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13310 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
13320 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
13330 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
13340 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
13350 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
13360 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13370 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
13380 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
13390 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
133a0 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
133b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
133c0 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
133d0 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
133e0 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
133f0 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
13400 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
13410 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
13420 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
13430 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
13440 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
13450 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
13460 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13470 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
13480 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
13490 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
134a0 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
134b0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
134c0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
134d0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
134e0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
134f0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
13500 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
13510 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
13520 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
13530 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
13540 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
13550 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
13560 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
13570 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
13580 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
13590 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
135a0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
135b0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
135c0 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  l);.    db->look
135d0 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d  aside.bDisable--
135e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
135f0 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
13600 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
13610 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73 65  rseMode = eParse
13620 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  Mode;.#endif.  }
13630 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
13640 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  ++;.  }.  pTable
13650 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
13660 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  aFlags |= DB_Unr
13670 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66 28  esetViews;.  if(
13680 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13690 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
136a0 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
136b0 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
136c0 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
136d0 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  = 0;.    pTable-
136e0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23  >nCol = 0;.  }.#
136f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13700 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
13710 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
13720 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
13730 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
13740 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
13750 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
13760 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
13770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13780 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
13790 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
137a0 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
137b0 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
137c0 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
137d0 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
137e0 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
137f0 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
13800 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
13810 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13820 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13830 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20  b, idx, 0) );.  
13840 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
13850 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
13860 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
13870 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
13880 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
13890 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
138a0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
138b0 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
138c0 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
138d0 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
138e0 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
138f0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
13900 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
13910 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
13920 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
13930 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
13940 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
13950 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
13960 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
13970 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
13980 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
13990 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
139a0 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
139b0 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
139c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
139d0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
139e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
139f0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
13a00 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
13a10 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
13a20 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
13a30 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
13a40 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
13a50 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
13a60 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
13a70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
13a80 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
13a90 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
13aa0 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
13ab0 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
13ac0 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
13ad0 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
13ae0 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
13af0 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
13b00 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
13b10 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
13b20 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
13b30 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
13b40 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
13b50 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
13b60 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
13b70 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
13b80 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
13b90 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
13ba0 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
13bb0 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
13bc0 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
13bd0 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
13be0 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
13bf0 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
13c00 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
13c10 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
13c20 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
13c30 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
13c40 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
13c50 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
13c60 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
13c70 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
13c80 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
13c90 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
13ca0 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
13cb0 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
13cc0 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
13cd0 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
13ce0 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
13cf0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
13d00 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
13d10 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
13d20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
13d30 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
13d40 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
13d50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13d60 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
13d70 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
13d80 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  oved(sqlite3 *db
13d90 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13da0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
13db0 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
13dc0 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
13dd0 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
13de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13df0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13e00 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13e10 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
13e20 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  Db];.  pHash = &
13e30 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
13e40 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
13e50 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
13e60 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
13e70 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
13e80 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
13e90 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
13ea0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
13eb0 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
13ec0 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
13ed0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
13ee0 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
13ef0 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
13f00 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
13f10 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
13f20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
13f30 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
13f40 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
13f50 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
13f60 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
13f70 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
13f80 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
13f90 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
13fa0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
13fb0 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
13fc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
13fd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
13fe0 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
13ff0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
14000 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
14010 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
14020 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
14030 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
14040 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
14050 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
14060 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
14070 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
14080 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
14090 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
140a0 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
140b0 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
140c0 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
140d0 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
140e0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
140f0 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
14100 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
14110 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
14120 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
14130 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
14140 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14150 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
14160 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
14170 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
14180 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 32  ;.  if( iTable<2
14190 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d   ) sqlite3ErrorM
141a0 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
141b0 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20 20  upt schema");.  
141c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
141d0 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
141e0 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
141f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
14200 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69  bort(pParse);.#i
14210 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14220 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
14230 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f  * OP_Destroy sto
14240 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65  res an in intege
14250 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e  r r1. If this in
14260 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
14270 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
14280 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
14290 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
142a0 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
142b0 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
142c0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
142d0 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
142e0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
142f0 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
14300 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
14310 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22  .  ** The "#NNN"
14320 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
14330 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
14340 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
14350 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
14360 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
14370 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61  NNN.  See gramma
14380 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74  r rules associat
14390 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52  ed with the TK_R
143a0 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b  EGISTER.  ** tok
143b0 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  en for additiona
143c0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
143d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
143e0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
143f0 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
14400 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
14410 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
14420 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
14430 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
14440 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
14450 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
14460 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  E, iTable, r1, r
14470 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
14480 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14490 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
144a0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
144b0 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
144c0 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
144d0 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
144e0 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
144f0 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
14500 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
14510 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
14520 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
14530 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
14540 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
14550 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
14560 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
14570 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
14580 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
14590 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
145a0 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
145b0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
145c0 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
145d0 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
145e0 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
145f0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
14600 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b){.  /* If the 
14610 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
14620 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
14630 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
14640 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14650 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
14660 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
14670 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
14680 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
14690 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
146a0 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
146b0 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
146c0 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
146d0 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
146e0 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
146f0 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
14700 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
14710 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
14720 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
14730 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
14740 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
14750 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
14760 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
14770 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
14780 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
14790 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
147a0 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
147b0 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
147c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
147d0 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
147e0 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
147f0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
14800 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
14810 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
14820 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
14830 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
14840 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
14850 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
14860 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
14870 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
14880 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
14890 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
148a0 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
148b0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
148c0 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
148d0 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
148e0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
148f0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
14900 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
14910 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
14920 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
14930 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
14940 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
14950 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
14960 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
14970 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
14980 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
14990 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
149a0 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
149b0 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
149c0 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
149d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
149e0 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
149f0 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
14a00 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
14a10 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
14a20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
14a30 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
14a40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14a50 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
14a60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
14a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a80 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
14a90 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14aa0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
14ab0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
14ac0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
14ad0 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
14ae0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
14af0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
14b00 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
14b10 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
14b20 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
14b30 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
14b40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
14b50 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
14b60 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
14b70 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28  bles (for N in (
14b80 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72  1,2,3)).** after
14b90 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72   a DROP INDEX or
14ba0 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
14bb0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  and..*/.static v
14bc0 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
14bd0 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61  StatTables(.  Pa
14be0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14bf0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
14c00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14c10 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20   int iDb,       
14c20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
14c30 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
14c40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
14c50 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69  zType,     /* "i
14c60 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a  dx" or "tbl" */.
14c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
14c80 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame      /* Name
14c90 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62   of index or tab
14ca0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
14cb0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14cc0 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65  zDbName = pParse
14cd0 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
14ce0 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69  DbSName;.  for(i
14cf0 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a  =1; i<=4; i++){.
14d00 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34      char zTab[24
14d10 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
14d20 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
14d30 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74  Tab),zTab,"sqlit
14d40 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20  e_stat%d",i);.  
14d50 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
14d60 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
14d70 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65  b, zTab, zDbName
14d80 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
14d90 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
14da0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
14db0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
14dc0 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20   WHERE %s=%Q",. 
14dd0 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20         zDbName, 
14de0 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61  zTab, zType, zNa
14df0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
14e00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
14e10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14e20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  drop a table..*/
14e30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
14e40 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
14e50 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
14e60 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20  *pTab, int iDb, 
14e70 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56  int isView){.  V
14e80 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
14e90 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14ea0 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  db;.  Trigger *p
14eb0 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70  Trigger;.  Db *p
14ec0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
14ed0 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  b];..  v = sqlit
14ee0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14ef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
14f00 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  0 );.  sqlite3Be
14f10 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
14f20 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
14f30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
14f40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14f50 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
14f60 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f80 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
14f90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
14fa0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
14fb0 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
14fc0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
14fd0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
14fe0 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65  ode.  ** is gene
14ff0 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
15000 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
15010 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
15020 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65  r.  ** sqlite_te
15030 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
15040 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  uired..  */.  pT
15050 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
15060 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
15070 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69  se, pTab);.  whi
15080 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
15090 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
150a0 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
150b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  Tab->pSchema || 
150c0 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
150d0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
150e0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
150f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f  ;.    sqlite3Dro
15100 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
15110 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
15120 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
15130 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
15140 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
15150 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
15160 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
15170 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
15180 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
15190 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
151a0 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  iated with.  ** 
151b0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
151c0 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
151d0 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
151e0 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
151f0 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74  d.  ** at the bt
15200 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
15210 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
15220 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
15230 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20  ds to.  ** move 
15240 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
15250 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
15260 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
15270 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20  um mode)..  */. 
15280 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
15290 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
152a0 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  rement ){.    sq
152b0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
152c0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
152d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
152e0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
152f0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
15300 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
15310 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
15320 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
15330 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
15340 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
15350 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
15360 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
15370 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61  r to the.  ** ta
15380 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
15390 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
153a0 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
153b0 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
153c0 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20  .  ** every row 
153d0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
153e0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
153f0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
15400 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72  ne being.  ** dr
15410 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
15420 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
15430 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
15440 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
15450 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
15460 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
15470 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
15480 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
15490 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  her.  ** databas
154a0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
154b0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
154c0 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c  rse, .      "DEL
154d0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
154e0 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
154f0 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
15500 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62  ger'",.      pDb
15510 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ->zDbSName, MAST
15520 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a  ER_NAME, pTab->z
15530 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73  Name);.  if( !is
15540 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75  View && !IsVirtu
15550 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
15560 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
15570 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  rse, pTab);.  }.
15580 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
15590 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
155a0 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
155b0 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
155c0 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
155d0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
155e0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
155f0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
15600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15610 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
15620 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
15630 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
15640 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
15650 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20  t(pParse);.  }. 
15660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15670 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
15680 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
15690 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
156a0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
156b0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
156c0 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
156d0 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
156e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
156f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15700 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
15710 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
15720 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
15730 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
15740 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
15750 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
15760 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
15770 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
15780 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
15790 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
157a0 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
157b0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
157c0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
157d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
157e0 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
157f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
15800 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
15810 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15820 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
15830 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
15840 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
15850 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
15860 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65  .  if( sqlite3Re
15870 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
15880 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
15890 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e  p_table;.  if( n
158a0 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
158b0 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65  essErr++;.  asse
158c0 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
158d0 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f   isView==LOCATE_
158e0 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d  VIEW );.  pTab =
158f0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
15900 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
15910 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e  isView, &pName->
15920 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45  a[0]);.  if( noE
15930 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
15940 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70  sErr--;..  if( p
15950 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
15960 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65  ( noErr ) sqlite
15970 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
15980 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
15990 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
159a0 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  base);.    goto 
159b0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
159c0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
159d0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
159e0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
159f0 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
15a00 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
15a10 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
15a20 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
15a30 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
15a40 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
15a50 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
15a60 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
15a70 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
15a80 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15a90 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
15aa0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
15ab0 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
15ac0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15ad0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
15ae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15af0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
15b00 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
15b10 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
15b20 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
15b30 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
15b40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
15b50 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
15b60 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  DbSName;.    con
15b70 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
15b80 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
15b90 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15ba0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
15bb0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
15bc0 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
15bd0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15be0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
15bf0 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
15c00 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
15c10 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
15c20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
15c30 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
15c40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15c50 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
15c60 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
15c70 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
15c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15c90 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
15ca0 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
15cb0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
15cc0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15cd0 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
15ce0 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
15cf0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
15d00 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
15d10 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
15d20 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
15d30 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
15d40 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
15d50 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15d60 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
15d70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15d80 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
15d90 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
15da0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15db0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15dc0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
15dd0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
15de0 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
15df0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15e00 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
15e10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15e20 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
15e30 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
15e40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
15e50 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
15e60 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15e70 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
15e80 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
15e90 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
15ea0 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
15eb0 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26  _", 7)==0 .    &
15ec0 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
15ed0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
15ee0 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31  sqlite_stat", 11
15ef0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
15f00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15f10 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
15f20 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
15f30 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
15f40 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
15f50 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
15f60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15f70 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
15f80 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
15f90 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
15fa0 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
15fb0 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
15fc0 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
15fd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
15fe0 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
15ff0 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
16000 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16010 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
16020 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
16030 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
16040 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
16050 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
16060 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
16070 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
16080 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
16090 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
160a0 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
160b0 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
160c0 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
160d0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
160e0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
160f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
16100 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16110 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
16120 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
16130 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
16140 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
16150 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16160 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
16170 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
16180 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
16190 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
161a0 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69  iDb);.    if( !i
161b0 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73  sView ){.      s
161c0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
161d0 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
161e0 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e  b, "tbl", pTab->
161f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
16200 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
16210 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
16220 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
16230 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
16240 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
16250 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29  ab, iDb, isView)
16260 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
16270 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
16280 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
16290 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
162a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
162b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
162c0 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
162d0 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
162e0 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
162f0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16300 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
16310 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
16320 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
16330 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
16340 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
16350 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
16360 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
16370 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
16380 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
16390 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
163a0 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
163b0 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
163c0 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b  referred to (a.k
163d0 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20  .a the "parent" 
163e0 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20  table).  pToCol 
163f0 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  is a list.** of 
16400 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61  tables in the pa
16410 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20  rent pTo table. 
16420 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
16430 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
16440 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
16450 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
16460 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
16470 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
16480 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
16490 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
164a0 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
164b0 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
164c0 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
164d0 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
164e0 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
164f0 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
16500 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
16510 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
16520 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ield..**.** The 
16530 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
16540 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
16550 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
16560 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
16570 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
16580 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
16590 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
165a0 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
165b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
165c0 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
165d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
165e0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
165f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16600 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
16610 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
16620 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
16630 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
16640 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
16650 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
16660 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
16670 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
16680 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
16690 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
166a0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
166b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
166c0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
166d0 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
166e0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
166f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
16700 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16710 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16720 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
16730 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
16740 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65  = 0;.  FKey *pNe
16750 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70  xtTo;.  Table *p
16760 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
16770 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
16780 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
16790 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
167a0 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
167b0 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
167c0 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
167d0 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
167e0 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
167f0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
16800 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
16810 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  -1;.    if( NEVE
16820 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f  R(iCol<0) ) goto
16830 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
16840 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
16850 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
16860 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16870 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
16880 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
16890 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
168a0 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
168b0 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
168c0 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
168d0 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
168e0 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
168f0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
16900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
16910 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
16920 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
16930 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
16940 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
16950 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16960 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
16970 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
16980 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
16990 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
169a0 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
169b0 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
169c0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
169d0 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
169e0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
169f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
16a00 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
16a10 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
16a20 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
16a30 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
16a40 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
16a50 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
16a60 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
16a70 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
16a80 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
16a90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
16aa0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
16ab0 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
16ac0 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
16ad0 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
16ae0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
16af0 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
16b00 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
16b10 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
16b20 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
16b30 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
16b40 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
16b50 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
16b60 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
16b70 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  ->aCol[nCol];.  
16b80 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
16b90 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
16ba0 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
16bb0 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
16bc0 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
16bd0 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a  d*)z, pTo);.  }.
16be0 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
16bf0 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
16c00 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
16c10 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
16c20 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  );.  z += pTo->n
16c30 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f  +1;.  pFKey->nCo
16c40 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
16c50 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
16c60 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
16c70 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
16c80 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
16c90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
16ca0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
16cb0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
16cc0 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
16cd0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
16ce0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
16cf0 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
16d00 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
16d10 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
16d20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
16d30 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
16d40 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
16d50 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
16d60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16d70 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
16d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16d90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
16da0 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
16db0 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
16dc0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
16dd0 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
16de0 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
16df0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
16e00 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
16e10 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
16e20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
16e30 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  BJECT ){.       
16e40 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
16e50 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c  kenRemap(pParse,
16e60 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d   &pFKey->aCol[i]
16e70 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
16e80 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
16e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16ea0 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
16eb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
16ec0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
16ed0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
16ee0 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
16ef0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
16f00 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
16f10 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66  ol = z;.      if
16f20 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
16f30 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CT ){.        sq
16f40 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
16f50 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a 2c  Remap(pParse, z,
16f60 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
16f70 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
16f80 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
16f90 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
16fa0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
16fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
16fc0 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
16fd0 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
16fe0 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
16ff0 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28  ->aAction[0] = (
17000 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66  u8)(flags & 0xff
17010 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
17020 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f   ON DELETE actio
17030 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41  n */.  pFKey->aA
17040 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28  ction[1] = (u8)(
17050 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
17060 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20  0xff);    /* ON 
17070 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f  UPDATE action */
17080 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17090 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
170a0 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63  ld(db, 0, p->pSc
170b0 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74  hema) );.  pNext
170c0 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c  To = (FKey *)sql
170d0 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
170e0 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79  p->pSchema->fkey
170f0 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b  Hash, .      pFK
17100 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a  ey->zTo, (void *
17110 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66  )pFKey.  );.  if
17120 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79  ( pNextTo==pFKey
17130 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
17140 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
17150 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
17160 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20  }.  if( pNextTo 
17170 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17180 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d  NextTo->pPrevTo=
17190 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 );.    pFKey-
171a0 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74  >pNextTo = pNext
171b0 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d  To;.    pNextTo-
171c0 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79  >pPrevTo = pFKey
171d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
171e0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
171f0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
17200 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
17210 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
17220 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
17230 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
17240 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17250 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  b, pFKey);.#endi
17260 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
17270 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
17280 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
17290 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
172a0 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b  e(db, pFromCol);
172b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
172c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  stDelete(db, pTo
172d0 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
172e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
172f0 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
17300 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
17310 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
17320 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
17330 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
17340 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
17350 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
17360 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
17370 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
17380 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
17390 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
173a0 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
173b0 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
173c0 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
173d0 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
173e0 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
173f0 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
17400 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
17410 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
17420 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
17430 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
17440 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
17450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
17460 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
17470 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
17480 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
17490 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
174a0 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
174b0 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
174c0 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
174d0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  n;.  assert( isD
174e0 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73  eferred==0 || is
174f0 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f  Deferred==1 ); /
17500 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31  * EV: R-30323-21
17510 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  917 */.  pFKey->
17520 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38  isDeferred = (u8
17530 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e  )isDeferred;.#en
17540 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
17550 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
17560 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
17570 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
17580 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
17590 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
175a0 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
175b0 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
175c0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
175d0 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
175e0 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
175f0 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
17600 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
17610 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
17620 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
17630 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
17640 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
17650 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67  reated.  The reg
17660 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20  ister specified 
17670 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
17680 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
17690 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
176a0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
176b0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
176c0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
176d0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
176e0 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
176f0 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
17700 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
17710 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
17720 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
17730 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
17740 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
17750 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
17760 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
17770 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
17780 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
17790 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
177a0 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
177b0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
177c0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
177d0 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
177e0 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
177f0 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
17800 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
17810 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
17820 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
17830 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
17840 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
17850 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
17860 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
17870 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65   */.  int iSorte
17880 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
17890 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
178a0 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72  pened by OpenSor
178b0 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20  ter (if in use) 
178c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
178f0 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
17900 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20  .  int addr2;   
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20    /* Address to 
17930 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74  jump to for next
17940 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
17950 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17970 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
17980 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ndex */.  int iP
17990 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20  artIdxLabel;    
179a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
179b0 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74   to this label t
179c0 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a  o skip a row */.
179d0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17a00 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
17a10 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
17a20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
17a50 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
17a60 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
17a70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17a80 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
17a90 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63  embled index rec
17aa0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
17ab0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17ac0 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
17ad0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17ae0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
17af0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
17b00 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
17b10 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
17b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17b30 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
17b40 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
17b50 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
17b60 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
17b70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
17b80 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
17b90 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29  Db].zDbSName ) )
17ba0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
17bb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
17bc0 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
17bd0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
17be0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
17bf0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
17c00 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
17c10 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
17c20 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
17c30 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
17c40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
17c50 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
17c60 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
17c70 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
17c80 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
17c90 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
17ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
17cb0 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
17cc0 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71  .  }.  pKey = sq
17cd0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
17ce0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
17cf0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ex);.  assert( p
17d00 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Key!=0 || db->ma
17d10 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
17d20 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20  arse->nErr );.. 
17d30 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72   /* Open the sor
17d40 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77 65  ter cursor if we
17d50 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e   are to use one.
17d60 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20   */.  iSorter = 
17d70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
17d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17d90 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
17da0 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30  Open, iSorter, 0
17db0 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
17dc0 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20  l, (char*).     
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17de0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
17df0 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e  (pKey), P4_KEYIN
17e00 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  FO);..  /* Open 
17e10 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20  the table. Loop 
17e20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73  through all rows
17e30 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69   of the table, i
17e40 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20  nserting index. 
17e50 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f   ** records into
17e60 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a   the sorter. */.
17e70 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
17e80 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
17e90 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
17ea0 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
17eb0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
17ec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17ed0 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64  nd, iTab, 0); Vd
17ee0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17ef0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
17f00 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17f10 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
17f20 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72  3MultiWrite(pPar
17f30 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
17f40 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
17f50 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
17f60 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
17f70 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
17f80 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
17f90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
17fa0 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
17fb0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
17fc0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
17fd0 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
17fe0 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
17ff0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
18000 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18010 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
18020 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
18030 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
18040 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18050 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
18060 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
18070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18080 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
18090 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
180a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
180b0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
180c0 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
180f0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
18100 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
18110 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
18120 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
18130 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
18140 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
18150 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
18160 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18170 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
18180 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
18190 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
181a0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
181b0 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74  ndex) ){.    int
181c0 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
181d0 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20  eGoto(v, 1);.   
181e0 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
181f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18200 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
18210 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61 62  dbeVerifyAbortab
18220 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b  le(v, OE_Abort);
18230 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18240 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
18250 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69  SorterCompare, i
18260 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52  Sorter, j2, regR
18270 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29  pIndex->nKeyCol)
182a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
182b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e  );.    sqlite3Un
182c0 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  iqueConstraint(p
182d0 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
182e0 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71   pIndex);.    sq
182f0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18300 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73  e(v, j2);.  }els
18310 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  e{.    addr2 = s
18320 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18330 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20  tAddr(v);.  }.  
18340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18350 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
18360 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ta, iSorter, reg
18370 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20  Record, iIdx);. 
18380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18390 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64  p1(v, OP_SeekEnd
183a0 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
183b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
183c0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
183d0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
183e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
183f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
18400 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
18410 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18420 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18430 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
18440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18450 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
18460 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
18470 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18480 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
18490 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
184a0 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  r1);..  sqlite3V
184b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
184c0 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
184d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
184e0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
184f0 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
18500 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18510 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b  Close, iSorter);
18520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
18530 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f  te heap space to
18540 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f   hold an Index o
18550 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20  bject with nCol 
18560 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  columns..**.** I
18570 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
18580 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70  cation size to p
18590 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20  rovide an extra 
185a0 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
185b0 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
185c0 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  d space after th
185d0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61  e Index object a
185e0 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70  nd return a.** p
185f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65  ointer to this e
18600 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70  xtra space in *p
18610 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78  pExtra..*/.Index
18620 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74   *sqlite3Allocat
18630 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20  eIndexObject(.  
18640 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
18650 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
18660 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18670 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20   i16 nCol,      
18680 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
18690 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
186a0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
186b0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
186c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
186d0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78  r of bytes of ex
186e0 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c  tra space to all
186f0 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  oc */.  char **p
18700 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20  pExtra       /* 
18710 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  Pointer to the "
18720 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a  extra" space */.
18730 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20  ){.  Index *p;  
18740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
18750 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a  ocated index obj
18760 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ect */.  int nBy
18770 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te;           /*
18780 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
18790 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  for Index object
187a0 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20   + arrays */..  
187b0 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
187c0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20  izeof(Index)) + 
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187e0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
187f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
18800 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
18810 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20  *)*nCol) +      
18820 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
18830 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
18840 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
18850 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
18860 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65  1) +     /* Inde
18870 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20  x.aiRowLogEst   
18880 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
18890 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a      sizeof(i16)*
188a0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
188b0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
188c0 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  umn   */.       
188d0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
188e0 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20  (u8)*nCol);     
188f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18900 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
18910 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
18920 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
18930 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  te + nExtra);.  
18940 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61  if( p ){.    cha
18950 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68  r *pExtra = ((ch
18960 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69  ar*)p)+ROUND8(si
18970 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
18980 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63    p->azColl = (c
18990 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74  onst char**)pExt
189a0 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f  ra; pExtra += RO
189b0 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
189c0 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  *)*nCol);.    p-
189d0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28  >aiRowLogEst = (
189e0 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20  LogEst*)pExtra; 
189f0 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
18a00 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
18a10 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75  );.    p->aiColu
18a20 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72  mn = (i16*)pExtr
18a30 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20  a;       pExtra 
18a40 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e  += sizeof(i16)*n
18a50 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  Col;.    p->aSor
18a60 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45  tOrder = (u8*)pE
18a70 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  xtra;.    p->nCo
18a80 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  lumn = nCol;.   
18a90 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43   p->nKeyCol = nC
18aa0 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45  ol - 1;.    *ppE
18ab0 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
18ac0 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20  ) + nByte;.  }. 
18ad0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
18ae0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
18af0 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
18b00 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
18b10 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
18b20 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
18b30 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
18b40 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
18b50 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
18b60 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
18b70 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
18b80 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
18b90 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
18ba0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
18bb0 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
18bc0 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
18bd0 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
18be0 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
18bf0 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
18c00 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
18c10 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
18c20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
18c30 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
18c40 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
18c50 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
18c60 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
18c70 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
18c80 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
18c90 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
18ca0 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
18cb0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
18cc0 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
18cd0 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
18ce0 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
18cf0 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
18d00 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
18d10 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
18d20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
18d30 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
18d40 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18d50 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
18d60 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
18d70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18d80 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
18d90 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
18da0 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
18db0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
18dc0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
18dd0 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
18de0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18df0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
18e00 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
18e10 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
18e20 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
18e30 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
18e40 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
18e50 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
18e60 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
18e70 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
18e80 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
18e90 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
18ea0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
18eb0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
18ec0 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
18ed0 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
18ee0 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
18ef0 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
18f00 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
18f10 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
18f20 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
18f30 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
18f40 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65    Expr *pPIWhere
18f50 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  ,    /* WHERE cl
18f60 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c  ause for partial
18f70 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
18f80 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
18f90 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
18fa0 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
18fb0 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
18fc0 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
18fd0 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st,    /* Omit e
18fe0 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
18ff0 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
19000 20 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20    u8 idxType    
19010 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
19020 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54  x type */.){.  T
19030 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
19040 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
19050 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
19060 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
19070 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
19080 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
19090 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
190a0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
190b0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
190c0 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
190d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
190e0 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
190f0 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
19100 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78  nt i, j;.  DbFix
19110 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
19120 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
19130 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
19140 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
19150 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
19160 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
19170 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
19180 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
19190 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
191a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
191b0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
191c0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
191d0 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
191e0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
191f0 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
19200 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
19210 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
19230 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
19240 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
19250 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
19260 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
19270 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
19280 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
19290 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
192a0 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
192b0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
192c0 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
192d0 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20  t nExtra = 0;   
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192f0 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
19300 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a  d for zExtra[] *
19310 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f  /.  int nExtraCo
19320 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
19330 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19340 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  f extra columns 
19350 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72  needed */.  char
19360 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20   *zExtra = 0;   
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19380 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65  Extra space afte
19390 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
193a0 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ct */.  Index *p
193b0 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Pk = 0;      /* 
193c0 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
193d0 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
193e0 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  WID tables */.. 
193f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19400 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
19410 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67  >nErr>0 ){.    g
19420 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19430 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
19440 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
19450 20 26 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c   && idxType!=SQL
19460 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
19470 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f  ARYKEY ){.    go
19480 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19490 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
194a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
194b0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
194c0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
194d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
194e0 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
194f0 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
19500 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
19510 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
19520 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
19530 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
19540 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
19550 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
19560 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
19570 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
19580 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
19590 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
195a0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
195b0 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
195c0 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
195d0 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
195e0 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
195f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19600 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
19610 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
19620 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
19630 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
19640 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
19650 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
19660 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
19670 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19680 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
19690 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a   && pName->z );.
196a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
196b0 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
196c0 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
196d0 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
196e0 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
196f0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
19700 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
19710 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
19720 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44  database to 1. D
19730 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20  o not do this.  
19740 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69    ** if initiali
19750 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  sing a database 
19760 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20  schema..    */. 
19770 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
19780 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70  .busy ){.      p
19790 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
197a0 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
197b0 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
197c0 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e      if( pName2->
197d0 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
197e0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
197f0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
19800 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62  a ){.        iDb
19810 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
19820 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
19830 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
19840 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
19850 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
19860 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e);.    if( sqli
19870 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
19880 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29  Fix, pTblName) )
19890 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
198a0 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
198b0 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
198c0 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
198d0 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
198e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
198f0 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
19900 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
19910 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
19920 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
19930 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
19940 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70  em(pParse, 0, &p
19950 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a  TblName->a[0]);.
19960 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
19970 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
19980 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  || pTab==0 );.  
19990 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
199a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
199b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
199c0 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44  iDb==1 && db->aD
199d0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d  b[iDb].pSchema!=
199e0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
199f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
19a00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
19a10 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
19a20 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50  ot create a TEMP
19a30 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45   index on non-TE
19a40 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22  MP table \"%s\""
19a50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
19a60 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
19a70 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19a80 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19a90 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
19aa0 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73  (pTab) ) pPk = s
19ab0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
19ac0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d  Index(pTab);.  }
19ad0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
19ae0 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
19af0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
19b00 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
19b10 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
19b20 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
19b30 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
19b40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19b50 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
19b60 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
19b70 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
19b80 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
19b90 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73  >aDb[iDb];..  as
19ba0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
19bb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
19bc0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
19bd0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
19be0 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
19bf0 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
19c00 30 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d  0 .       && db-
19c10 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 20 20  >init.busy==0.  
19c20 20 20 20 20 20 26 26 20 70 54 62 6c 4e 61 6d 65       && pTblName
19c30 21 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  !=0.#if SQLITE_U
19c40 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
19c50 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ON.       && sql
19c60 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
19c70 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d  e(pTab->zName)==
19c80 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
19c90 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c  SQLITE_ALLOW_SQL
19ca0 49 54 45 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58  ITE_MASTER_INDEX
19cb0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
19cc0 65 33 53 74 72 49 43 6d 70 28 26 70 54 61 62 2d  e3StrICmp(&pTab-
19cd0 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65  >zName[7],"maste
19ce0 72 22 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 29  r")!=0.#endif. )
19cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
19d00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
19d10 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
19d20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
19d30 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
19d40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19d50 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
19d60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19d70 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  IEW.  if( pTab->
19d80 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
19d90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19da0 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
19db0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
19dc0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
19dd0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19de0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
19df0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19e00 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
19e10 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
19e20 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
19e30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19e40 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73   "virtual tables
19e50 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
19e60 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
19e70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19e80 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
19e90 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
19ea0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
19eb0 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
19ec0 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
19ed0 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
19ee0 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
19ef0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
19f00 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
19f10 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
19f20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
19f30 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
19f40 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
19f50 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
19f60 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
19f70 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
19f80 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
19f90 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
19fa0 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
19fb0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
19fc0 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
19fd0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
19fe0 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
19ff0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
1a000 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
1a010 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
1a020 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
1a030 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
1a040 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
1a050 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
1a060 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
1a070 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
1a080 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
1a090 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
1a0a0 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
1a0b0 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
1a0c0 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
1a0d0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1a0e0 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
1a0f0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
1a100 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1a110 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
1a120 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21  ssert( pName->z!
1a130 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  =0 );.    if( SQ
1a140 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1a150 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
1a160 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
1a170 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1a180 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a190 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 49      }.    if( !I
1a1a0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1a1b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62  ){.      if( !db
1a1c0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1a1d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1a1e0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
1a1f0 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
1a200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a210 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a220 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
1a230 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
1a240 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
1a250 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78           goto ex
1a260 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a280 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
1a290 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
1a2a0 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44  , zName, pDb->zD
1a2b0 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  bSName)!=0 ){.  
1a2c0 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74        if( !ifNot
1a2d0 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  Exist ){.       
1a2e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a2f0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
1a300 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
1a310 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
1a320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1a340 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
1a350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1a360 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1a370 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
1a380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a390 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a3a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1a3b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1a3c0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
1a3d0 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
1a3e0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
1a3f0 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
1a400 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
1a410 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
1a420 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
1a430 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1a440 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
1a450 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
1a460 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
1a470 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
1a480 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a490 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a4a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f    }..    /* Auto
1a4b0 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65  matic index name
1a4c0 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
1a4d0 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f   within sqlite3_
1a4e0 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 20  declare_vtab(). 
1a4f0 20 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65 20     ** must have 
1a500 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 64  names that are d
1a510 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72  istinct from nor
1a520 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  mal automatic in
1a530 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a  dex names..    *
1a540 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a550 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72  statement conver
1a560 74 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74 6f  ts "sqlite3_auto
1a570 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20  index..." into. 
1a580 20 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62     ** "sqlite3_b
1a590 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20  utoindex..." in 
1a5a0 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68  order to make th
1a5b0 65 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63 74  e names distinct
1a5c0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76 74  ..    ** The "vt
1a5d0 61 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65 73  ab_err.test" tes
1a5e0 74 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74  t demonstrates t
1a5f0 68 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73 20  he need of this 
1a600 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
1a610 20 20 69 66 28 20 49 4e 5f 53 50 45 43 49 41 4c    if( IN_SPECIAL
1a620 5f 50 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b 37  _PARSE ) zName[7
1a630 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ]++;.  }..  /* C
1a640 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
1a650 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
1a660 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
1a670 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a680 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1a690 4e 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41  N.  if( !IN_RENA
1a6a0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
1a6b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a6c0 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65   = pDb->zDbSName
1a6d0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1a6e0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1a6f0 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
1a700 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1a710 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
1a720 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a730 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a740 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
1a750 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
1a760 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1a770 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1a780 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
1a790 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
1a7a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1a7b0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1a7c0 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
1a7d0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1a7e0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a7f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a800 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1a810 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
1a820 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
1a830 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1a840 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
1a850 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
1a860 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
1a870 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
1a880 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
1a890 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
1a8a0 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
1a8b0 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
1a8c0 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
1a8d0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1a8e0 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f      Token prevCo
1a8f0 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70  l;.    Column *p
1a900 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
1a910 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b  l[pTab->nCol-1];
1a920 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
1a930 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55  ags |= COLFLAG_U
1a940 4e 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74  NIQUE;.    sqlit
1a950 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65  e3TokenInit(&pre
1a960 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  vCol, pCol->zNam
1a970 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
1a980 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1a990 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1a9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1a9b0 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
1a9c0 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76  db, TK_ID, &prev
1a9d0 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  Col, 0));.    if
1a9e0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
1a9f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1aa00 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
1aa10 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31   pList->nExpr==1
1aa20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
1aa30 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
1aa40 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f  der(pList, sortO
1aa50 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rder);.  }else{.
1aa60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1aa70 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70  istCheckLength(p
1aa80 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69  Parse, pList, "i
1aa90 6e 64 65 78 22 29 3b 0a 20 20 20 20 69 66 28 20  ndex");.    if( 
1aaa0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
1aab0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1aac0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
1aad0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1aae0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
1aaf0 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
1ab00 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
1ab10 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
1ab20 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
1ab30 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
1ab40 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1ab50 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1ab60 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1ab70 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
1ab80 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
1ab90 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
1aba0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1abb0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
1abc0 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
1abd0 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
1abe0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
1abf0 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
1ac00 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
1ac10 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
1ac20 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
1ac30 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
1ac40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
1ac50 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
1ac60 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
1ac70 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 61 73  KeyCol : 1;.  as
1ac80 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
1ac90 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 20 3c  pr + nExtraCol <
1aca0 3d 20 33 32 37 36 37 20 2f 2a 20 46 69 74 73 20  = 32767 /* Fits 
1acb0 69 6e 20 69 31 36 20 2a 2f 20 29 3b 0a 20 20 70  in i16 */ );.  p
1acc0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
1acd0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
1ace0 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
1acf0 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
1ad00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
1ad30 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
1ad40 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
1ad50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1ad60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1ad70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
1ad80 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1ad90 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
1ada0 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  ndex->aiRowLogEs
1adb0 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
1adc0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1add0 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
1ade0 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
1adf0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61  ->zName = zExtra
1ae00 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e  ;.  zExtra += nN
1ae10 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70  ame + 1;.  memcp
1ae20 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
1ae30 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
1ae40 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
1ae50 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
1ae60 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28  dex->onError = (
1ae70 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49  u8)onError;.  pI
1ae80 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1ae90 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  l = onError!=OE_
1aea0 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  None;.  pIndex->
1aeb0 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
1aec0 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  e;.  pIndex->pSc
1aed0 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
1aee0 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
1aef0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d  Index->nKeyCol =
1af00 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
1af10 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b   if( pPIWhere ){
1af20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1af30 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
1af40 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
1af50 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68  C_PartIdx, pPIWh
1af60 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e  ere, 0);.    pIn
1af70 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  dex->pPartIdxWhe
1af80 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20  re = pPIWhere;. 
1af90 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b     pPIWhere = 0;
1afa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
1afb0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1afc0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
1afd0 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
1afe0 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
1aff0 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
1b000 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
1b010 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
1b020 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
1b030 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
1b040 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
1b050 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
1b060 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
1b070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
1b080 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
1b090 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
1b0a0 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  C */.  }..  /* A
1b0b0 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20  nalyze the list 
1b0c0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  of expressions t
1b0d0 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72  hat form the ter
1b0e0 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ms of the index 
1b0f0 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20  and.  ** report 
1b100 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20  any errors.  In 
1b110 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1b120 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73  where the expres
1b130 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a  sion is exactly.
1b140 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c    ** a table col
1b150 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20  umn, store that 
1b160 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75  column in aiColu
1b170 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72  mn[].  For gener
1b180 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  al expressions,.
1b190 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49    ** populate pI
1b1a0 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61  ndex->aColExpr a
1b1b0 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52  nd store XN_EXPR
1b1c0 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d   (-2) in aiColum
1b1d0 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n[]..  **.  ** T
1b1e0 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72  ODO: Issue a war
1b1f0 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d  ning if two or m
1b200 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ore columns of t
1b210 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64 65  he index are ide
1b220 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44  ntical..  ** TOD
1b230 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
1b240 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ng if the table 
1b250 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
1b260 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1b270 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65  he.  ** index ke
1b280 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 49  y..  */.  pListI
1b290 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a  tem = pList->a;.
1b2a0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1b2b0 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 49  OBJECT ){.    pI
1b2c0 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d  ndex->aColExpr =
1b2d0 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73   pList;.    pLis
1b2e0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  t = 0;.  }.  for
1b2f0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
1b300 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c  nKeyCol; i++, pL
1b310 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
1b320 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20  Expr *pCExpr;   
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b340 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78  * The i-th index
1b350 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1b360 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
1b370 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20  SortOrder;      
1b380 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43    /* ASC or DESC
1b390 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70   on the i-th exp
1b3a0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63  ression */.    c
1b3b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1b3c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b3d0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
1b3e0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
1b3f0 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
1b400 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  Id(pListItem->pE
1b410 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
1b420 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
1b430 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54  rence(pParse, pT
1b440 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20  ab, NC_IdxExpr, 
1b450 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1b460 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 0);.    if( pP
1b470 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
1b480 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1b490 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20  dex;.    pCExpr 
1b4a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1b4b0 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74  pCollate(pListIt
1b4c0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1b4d0 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d  if( pCExpr->op!=
1b4e0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1b4f0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61     if( pTab==pPa
1b500 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
1b510 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b520 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b530 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70  , "expressions p
1b540 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52 49  rohibited in PRI
1b550 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20  MARY KEY and ". 
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b580 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1b590 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ts");.        go
1b5a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b5b0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1b5c0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
1b5d0 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20  aColExpr==0 ){. 
1b5e0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1b5f0 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b  ColExpr = pList;
1b600 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
1b610 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1b620 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20    j = XN_EXPR;. 
1b630 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1b640 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58  olumn[i] = XN_EX
1b650 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  PR;.      pIndex
1b660 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1b670 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1b680 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e      j = pCExpr->
1b690 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61  iColumn;.      a
1b6a0 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66  ssert( j<=0x7fff
1b6b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c   );.      if( j<
1b6c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
1b6d0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
1b6e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1b6f0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
1b700 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
1b710 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1b720 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  tNull = 0;.     
1b730 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1b740 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28  >aiColumn[i] = (
1b750 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20  i16)j;.    }.   
1b760 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   zColl = 0;.    
1b770 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
1b780 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1b790 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  LATE ){.      in
1b7a0 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a  t nColl;.      z
1b7b0 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
1b7c0 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
1b7d0 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
1b7e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1b7f0 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
1b800 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
1b810 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
1b820 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
1b830 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
1b840 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
1b850 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
1b860 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
1b870 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
1b880 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
1b890 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1b8a0 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
1b8b0 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
1b8c0 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c   }.    if( !zCol
1b8d0 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  l ) zColl = sqli
1b8e0 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1b8f0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1b900 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
1b910 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1b920 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
1b930 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b940 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b950 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
1b960 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
1b970 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
1b980 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
1b990 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
1b9a0 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
1b9b0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
1b9c0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
1b9d0 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
1b9e0 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
1b9f0 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65  Append the table
1ba00 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20   key to the end 
1ba10 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46  of the index.  F
1ba20 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1ba30 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68  .  ** tables (wh
1ba40 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20  en pPk!=0) this 
1ba50 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c  will be the decl
1ba60 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  ared PRIMARY KEY
1ba70 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d  .  For.  ** norm
1ba80 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  al tables (when 
1ba90 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk==0) this wil
1baa0 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a  l be the rowid..
1bab0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29    */.  if( pPk )
1bac0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
1bad0 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1bae0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  ++){.      int x
1baf0 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
1bb00 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
1bb10 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
1bb20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70   if( hasColumn(p
1bb30 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  Index->aiColumn,
1bb40 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
1bb50 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , x) ){.        
1bb60 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pIndex->nColumn-
1bb70 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -; .      }else{
1bb80 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1bb90 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78  >aiColumn[i] = x
1bba0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1bbb0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  ->azColl[i] = pP
1bbc0 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  k->azColl[j];.  
1bbd0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53        pIndex->aS
1bbe0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50  ortOrder[i] = pP
1bbf0 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
1bc00 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
1bc10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1bc20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64   assert( i==pInd
1bc30 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  ex->nColumn );. 
1bc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64   }else{.    pInd
1bc50 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1bc60 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
1bc70 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1bc80 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
1bc90 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  NARY;.  }.  sqli
1bca0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1bcb0 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
1bcc0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1bcd0 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49  e==0 ) estimateI
1bce0 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78  ndexWidth(pIndex
1bcf0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1bd00 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20   index contains 
1bd10 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
1bd20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  its table, then 
1bd30 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20  mark.  ** it as 
1bd40 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1bd50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61   */.  assert( Ha
1bd60 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20  sRowid(pTab) .  
1bd70 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b      || pTab->iPK
1bd80 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43  ey<0 || sqlite3C
1bd90 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e  olumnOfIndex(pIn
1bda0 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79  dex, pTab->iPKey
1bdb0 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d 70  )>=0 );.  recomp
1bdc0 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64  uteColumnsNotInd
1bdd0 65 78 65 64 28 70 49 6e 64 65 78 29 3b 0a 20 20  exed(pIndex);.  
1bde0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
1bdf0 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  && pIndex->nColu
1be00 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  mn>=pTab->nCol )
1be10 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73  {.    pIndex->is
1be20 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20  Covering = 1;.  
1be30 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1be40 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1be50 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
1be60 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
1be70 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
1be80 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1be90 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20  ex(pIndex,j)>=0 
1bea0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1beb0 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65    pIndex->isCove
1bec0 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ring = 0;.      
1bed0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1bee0 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
1bef0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
1bf00 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
1bf10 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
1bf20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
1bf30 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
1bf40 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
1bf50 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
1bf60 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1bf70 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
1bf80 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
1bf90 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
1bfa0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1bfb0 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
1bfc0 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
1bfd0 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
1bfe0 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
1bff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
1c000 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
1c010 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
1c020 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1c030 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
1c040 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
1c050 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
1c060 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
1c070 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
1c080 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
1c090 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
1c0a0 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
1c0b0 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
1c0c0 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
1c0d0 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
1c0e0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
1c0f0 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
1c100 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
1c110 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
1c120 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
1c130 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
1c140 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49  *.    ** Two UNI
1c150 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1c160 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
1c170 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1c180 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20  uivalent.    ** 
1c190 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65  (and thus suppre
1c1a0 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64  ssing the second
1c1b0 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68   one) even if th
1c1c0 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ey have differen
1c1d0 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72  t.    ** sort or
1c1e0 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ders..    **.   
1c1f0 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   ** If there are
1c200 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61   different colla
1c210 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f  ting sequences o
1c220 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  r if the columns
1c230 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
1c240 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20  onstraint occur 
1c250 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64  in different ord
1c260 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
1c270 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20  nstraints are.  
1c280 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
1c290 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74  distinct and bot
1c2a0 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61  h result in sepa
1c2b0 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20  rate indices..  
1c2c0 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
1c2d0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
1c2e0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1c2f0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
1c300 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c310 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
1c320 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64  ert( IsUniqueInd
1c330 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20  ex(pIdx) );.    
1c340 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1c350 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
1c360 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29  IDXTYPE_APPDEF )
1c370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c380 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1c390 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20  ndex) );..      
1c3a0 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
1c3b0 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  l!=pIndex->nKeyC
1c3c0 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
1c3d0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
1c3e0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b  pIdx->nKeyCol; k
1c3f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
1c400 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20  st char *z1;.   
1c410 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c420 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73  *z2;.        ass
1c430 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
1c440 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[k]>=0 );.   
1c450 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
1c460 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
1c470 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
1c480 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1c490 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f   z1 = pIdx->azCo
1c4a0 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a  ll[k];.        z
1c4b0 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  2 = pIndex->azCo
1c4c0 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[k];.        i
1c4d0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1c4e0 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
1c4f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c500 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b   if( k==pIdx->nK
1c510 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
1c520 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
1c530 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
1c540 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
1c550 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
1c560 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
1c570 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
1c580 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1c590 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1c5a0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
1c5b0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
1c5c0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1c5d0 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
1c5e0 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
1c5f0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
1c600 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
1c610 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
1c620 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1c630 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
1c640 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
1c650 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
1c660 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
1c670 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
1c680 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
1c690 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
1c6a0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
1c6b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
1c6c0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
1c6d0 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20  ed behavior for 
1c6e0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
1c6f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c700 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
1c710 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1c720 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
1c730 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
1c740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1c750 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c760 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1c770 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
1c780 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
1c790 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
1c7a0 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
1c7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1c7c0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
1c7d0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
1c7e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
1c7f0 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
1c800 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
1c810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c830 20 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45   idxType==SQLITE
1c840 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
1c850 4b 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54  KEY ) pIdx->idxT
1c860 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20  ype = idxType;. 
1c870 20 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45         if( IN_RE
1c880 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
1c890 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1c8a0 3e 70 4e 65 78 74 20 3d 20 70 50 61 72 73 65 2d  >pNext = pParse-
1c8b0 3e 70 4e 65 77 49 6e 64 65 78 3b 0a 20 20 20 20  >pNewIndex;.    
1c8c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e        pParse->pN
1c8d0 65 77 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  ewIndex = pIndex
1c8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64  ;.          pInd
1c8f0 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
1c900 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
1c910 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1c920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c930 20 20 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52    }..  if( !IN_R
1c940 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
1c950 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  .    /* Link the
1c960 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
1c970 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
1c980 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
1c990 65 72 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d  er.    ** in-mem
1c9a0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
1c9b0 75 63 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f  uctures. .    */
1c9c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c9d0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
1c9e0 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1c9f0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49  .busy ){.      I
1ca00 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61  ndex *p;.      a
1ca10 73 73 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49  ssert( !IN_SPECI
1ca20 41 4c 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20  AL_PARSE );.    
1ca30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ca40 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1ca50 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
1ca60 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
1ca70 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
1ca80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
1ca90 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
1caa0 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
1cab0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1cac0 33 49 6e 64 65 78 48 61 73 44 75 70 6c 69 63 61  3IndexHasDuplica
1cad0 74 65 52 6f 6f 74 50 61 67 65 28 70 49 6e 64 65  teRootPage(pInde
1cae0 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x) ){.          
1caf0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1cb00 70 50 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64  pParse, "invalid
1cb10 20 72 6f 6f 74 70 61 67 65 22 29 3b 0a 20 20 20   rootpage");.   
1cb20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1cb30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1cb40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1cb50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1cb60 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1cb70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cb80 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
1cb90 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
1cba0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
1cbb0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  sh, .          p
1cbc0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49  Index->zName, pI
1cbd0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 69 66 28  ndex);.      if(
1cbe0 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73   p ){.        as
1cbf0 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
1cc00 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
1cc10 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1cc20 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1cc30 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
1cc40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1cc50 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1cc60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
1cc70 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
1cc80 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
1cc90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cca0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 69  If this is the i
1ccb0 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e  nitial CREATE IN
1ccc0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f  DEX statement (o
1ccd0 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69  r CREATE TABLE i
1cce0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64  f the.    ** ind
1ccf0 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
1cd00 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
1cd10 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1cd20 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
1cd30 68 65 6e 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20  hen.    ** emit 
1cd40 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  code to allocate
1cd50 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70   the index rootp
1cd60 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20  age on disk and 
1cd70 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  make an entry fo
1cd80 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  r.    ** the ind
1cd90 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ex in the sqlite
1cda0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
1cdb0 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69  d populate the i
1cdc0 6e 64 65 78 20 77 69 74 68 0a 20 20 20 20 2a 2a  ndex with.    **
1cdd0 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20   content.  But, 
1cde0 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69  do not do this i
1cdf0 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20  f we are simply 
1ce00 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
1ce10 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a  te_master.    **
1ce20 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20   table to parse 
1ce30 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69  the schema, or i
1ce40 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
1ce50 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
1ce60 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20  index.    ** of 
1ce70 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1ce80 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
1ce90 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
1cea0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
1ceb0 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
1cec0 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69  ated as an impli
1ced0 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20  ed PRIMARY KEY. 
1cee0 20 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20     ** or UNIQUE 
1cef0 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
1cf00 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1cf10 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
1cf20 62 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a  ble.    ** has j
1cf30 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
1cf40 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
1cf50 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
1cf60 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
1cf70 6f 6e 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 63  on.    ** step c
1cf80 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
1cf90 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
1cfa0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1cfb0 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30  ) || pTblName!=0
1cfc0 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a   ){.      Vdbe *
1cfd0 76 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  v;.      char *z
1cfe0 53 74 6d 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Stmt;.      int 
1cff0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1d000 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20  >nMem;..      v 
1d010 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1d020 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1d030 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1d040 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1d050 78 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x;..      sqlite
1d060 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1d070 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
1d080 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  iDb);..      /* 
1d090 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
1d0a0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
1d0b0 78 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e  x using CreateIn
1d0c0 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a  dex. But before.
1d0d0 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73        ** doing s
1d0e0 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69  o, code a Noop i
1d0f0 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73  nstruction and s
1d100 74 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73  tore its address
1d110 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e   in .      ** In
1d120 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69  dex.tnum. This i
1d130 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
1d140 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  se this index is
1d150 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20   actually a .   
1d160 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
1d170 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  Y and the table 
1d180 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49  is actually a WI
1d190 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1d1a0 65 2e 20 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20  e. In .      ** 
1d1b0 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f  that case the co
1d1c0 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
1d1d0 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  widTable() routi
1d1e0 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a  ne will replace.
1d1f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f        ** the Noo
1d200 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f  p with a Goto to
1d210 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56   jump over the V
1d220 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74  DBE code generat
1d230 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ed below. */.   
1d240 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
1d250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d260 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(v, OP_Noop);
1d270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d280 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1d290 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
1d2a0 20 69 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f   iMem, BTREE_BLO
1d2b0 42 4b 45 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  BKEY);..      /*
1d2c0 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
1d2d0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1d2e0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1d2f0 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
1d300 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
1d310 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
1d320 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  /.      if( pSta
1d330 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rt ){.        in
1d340 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72  t n = (int)(pPar
1d350 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
1d360 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70   - pName->z) + p
1d370 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1d380 6e 2e 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  n.n;.        if(
1d390 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d   pName->z[n-1]==
1d3a0 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  ';' ) n--;.     
1d3b0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1d3c0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1d3d0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1d3e0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1d3f0 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73         zStmt = s
1d400 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1d410 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
1d420 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
1d430 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
1d440 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
1d450 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65  NIQUE", n, pName
1d460 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->z);.      }els
1d470 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  e{.        /* An
1d480 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1d490 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
1d4a0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1d4b0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
1d4c0 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74  /.        /* zSt
1d4d0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1d4e0 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
1d4f0 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
1d500 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1d510 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
1d520 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
1d530 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
1d540 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1d550 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1d560 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1d570 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1d580 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1d590 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1d5a0 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20  Q);",.          
1d5b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1d5c0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
1d5d0 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49  ME,.          pI
1d5e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1d5f0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1d600 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4d  me,.          iM
1d610 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53  em,.          zS
1d620 74 6d 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  tmt.          );
1d630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1d640 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
1d650 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  ..      /* Fill 
1d660 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1d670 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1d680 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1d690 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1d6a0 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1d6b0 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1d6c0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1d6d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d6e0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
1d6f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d700 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1d710 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
1d720 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d730 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1d740 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1d750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d760 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1d770 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
1d780 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1d790 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1d7a0 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1d7b0 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1d7c0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ame));.        s
1d7d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d7e0 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
1d7f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
1d800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d810 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64  JumpHere(v, pInd
1d820 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d  ex->tnum);.    }
1d830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
1d840 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
1d850 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1d860 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
1d870 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
1d880 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
1d890 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
1d8a0 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
1d8b0 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
1d8c0 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
1d8d0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1d8e0 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
1d8f0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
1d900 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
1d910 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
1d920 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
1d930 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
1d940 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
1d950 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
1d960 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
1d970 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1d980 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
1d990 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
1d9a0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1d9b0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1d9c0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1d9d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
1d9e0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
1d9f0 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
1da00 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
1da10 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
1da20 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
1da30 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
1da40 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
1da50 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
1da60 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
1da70 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
1da80 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
1da90 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
1daa0 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
1dab0 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
1dac0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
1dad0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1dae0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
1daf0 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
1db00 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
1db10 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1db20 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65  dex = 0;.  }.  e
1db30 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  lse if( IN_RENAM
1db40 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1db50 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1db60 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  pNewIndex==0 );.
1db70 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
1db80 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1db90 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1dba0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1dbb0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1dbc0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1dbd0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1dbe0 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33 46 72  ndex ) sqlite3Fr
1dbf0 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1dc00 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1dc10 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1dc20 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1dc30 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1dc40 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1dc50 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1dc60 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1dc70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1dc80 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  e(db, zName);.}.
1dc90 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1dca0 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1dcb0 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1dcc0 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1dcd0 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1dce0 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1dcf0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1dd00 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1dd10 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1dd20 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1dd30 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
1dd40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1dd50 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
1dd60 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
1dd70 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
1dd80 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
1dd90 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
1dda0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1ddb0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
1ddc0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
1ddd0 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1dde0 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
1ddf0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
1de00 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1de10 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
1de20 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1de30 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
1de40 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
1de50 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1de60 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lar combination 
1de70 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1de80 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1de90 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1dea0 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1deb0 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1dec0 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1ded0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1dee0 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1def0 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1df00 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1df10 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1df20 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1df30 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1df40 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1df50 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1df60 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1df70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1df80 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1df90 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1dfa0 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1dfb0 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1dfc0 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1dfd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dfe0 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1dff0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f  ndex *pIdx){.  /
1e000 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e010 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c   10,  9,  8,  7,
1e020 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20    6 */.  LogEst 
1e030 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33  aVal[] = { 33, 3
1e040 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b  2, 30, 28, 26 };
1e050 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70  .  LogEst *a = p
1e060 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
1e070 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20  ;.  int nCopy = 
1e080 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56  MIN(ArraySize(aV
1e090 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  al), pIdx->nKeyC
1e0a0 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ol);.  int i;.. 
1e0b0 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68   /* Indexes with
1e0c0 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74   default row est
1e0d0 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f  imates should no
1e0e0 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74  t have stat1 dat
1e0f0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  a */.  assert( !
1e100 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
1e110 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1e120 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d  first entry (num
1e130 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1e140 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65  he index) to the
1e150 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a   estimated .  **
1e160 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1e170 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1e180 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72   half the number
1e190 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1e1a0 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61  table.  ** for a
1e1b0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20   partial index. 
1e1c0 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74    But do not let
1e1d0 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72   the estimate dr
1e1e0 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a  op below 10. */.
1e1f0 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70    a[0] = pIdx->p
1e200 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
1e210 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  t;.  if( pIdx->p
1e220 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
1e230 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61  ) a[0] -= 10;  a
1e240 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
1e250 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
1e260 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1e270 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1e280 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1e290 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 33==sqlite3Lo
1e2a0 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f  gEst(10) );..  /
1e2b0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20  * Estimate that 
1e2c0 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d  a[1] is 10, a[2]
1e2d0 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38   is 9, a[3] is 8
1e2e0 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35  , a[4] is 7, a[5
1e2f0 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20  ] is.  ** 6 and 
1e300 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1e310 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69  value (if any) i
1e320 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  s 5.  */.  memcp
1e330 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e  y(&a[1], aVal, n
1e340 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45  Copy*sizeof(LogE
1e350 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  st));.  for(i=nC
1e360 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  opy+1; i<=pIdx->
1e370 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1e380 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20     a[i] = 23;   
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c   assert( 23==sql
1e3b0 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b  ite3LogEst(5) );
1e3c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e3d0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1e3e0 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55  (1) );.  if( IsU
1e3f0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1e400 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43   ) a[pIdx->nKeyC
1e410 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ol] = 0;.}../*.*
1e420 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1e430 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1e440 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1e450 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1e460 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1e470 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1e480 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1e490 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1e4a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e4b0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1e4c0 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1e4d0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1e4e0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1e4f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1e500 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1e510 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e520 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1e530 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1e540 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1e550 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1e560 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1e570 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1e580 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1e590 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1e5a0 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1e5b0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1e5c0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1e5d0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1e5e0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e5f0 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1e600 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1e610 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1e620 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1e630 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1e640 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1e650 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1e660 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1e670 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1e680 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1e690 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1e6a0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1e6b0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1e6c0 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1e6d0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1e6e0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1e6f0 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1e700 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1e710 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1e720 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e730 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1e740 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
1e750 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
1e760 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEF ){.    sqlit
1e770 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e780 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
1e790 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
1e7a0 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
1e7b0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1e7c0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
1e7d0 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
1e7e0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1e7f0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
1e800 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1e810 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
1e820 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
1e830 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e840 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1e850 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
1e860 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
1e870 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
1e880 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
1e890 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
1e8a0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
1e8b0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1e8c0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
1e8d0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
1e8e0 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
1e8f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e900 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e910 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
1e920 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
1e930 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1e940 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1e950 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1e960 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
1e970 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1e980 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
1e990 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e9a0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
1e9b0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
1e9c0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1e9d0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1e9e0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1e9f0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1ea00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
1ea10 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
1ea20 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
1ea30 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
1ea40 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
1ea50 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1ea60 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1ea70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1ea80 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1ea90 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1eaa0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
1eab0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1eac0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
1ead0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
1eae0 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74  RE name=%Q AND t
1eaf0 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20  ype='index'",.  
1eb00 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1eb10 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
1eb20 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d  ER_NAME, pIndex-
1eb30 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
1eb40 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
1eb50 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
1eb60 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e   iDb, "idx", pIn
1eb70 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  dex->zName);.   
1eb80 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1eb90 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1eba0 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
1ebb0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
1ebc0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
1ebd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ebe0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
1ebf0 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
1ec00 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
1ec10 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
1ec20 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
1ec30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1ec40 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
1ec50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
1ec60 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1ec70 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
1ec80 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63  ects. Each objec
1ec90 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
1eca0 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
1ecb0 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  es in size. This
1ecc0 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71   routine uses sq
1ecd0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29  lite3DbRealloc()
1ece0 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68  .** to extend th
1ecf0 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  e array so that 
1ed00 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66  there is space f
1ed10 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20  or a new object 
1ed20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
1ed30 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
1ed40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1ed50 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e  *pnEntry contain
1ed60 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  s the current si
1ed70 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72  ze of.** the arr
1ed80 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d  ay (in entries -
1ed90 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   so the allocati
1eda0 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79  on is ((*pnEntry
1edb0 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74  ) * szEntry) byt
1edc0 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e  es.** in total).
1edd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1ede0 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65  alloc() is succe
1edf0 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e  ssful (i.e. if n
1ee00 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  o OOM condition 
1ee10 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20  occurs), the.** 
1ee20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1ee30 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  for the new obje
1ee40 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70  ct is zeroed, *p
1ee50 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74  nEntry updated t
1ee60 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65  o.** reflect the
1ee70 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1ee80 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69   array and a poi
1ee90 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1eea0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65  allocation.** re
1eeb0 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73  turned. *pIdx is
1eec0 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
1eed0 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72  x of the new arr
1eee0 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  ay entry in this
1eef0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   case..**.** Oth
1ef00 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72  erwise, if the r
1ef10 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20  ealloc() fails, 
1ef20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1ef30 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d  -1, *pnEntry rem
1ef40 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  ains.** unchange
1ef50 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  d and a copy of 
1ef60 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e  pArray returned.
1ef70 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
1ef80 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1ef90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1efa0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1efb0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1efc0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1efd0 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79  /.  void *pArray
1efe0 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ,     /* Array o
1eff0 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68  f objects.  Migh
1f000 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  t be reallocated
1f010 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72   */.  int szEntr
1f020 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  y,      /* Size 
1f030 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69  of each object i
1f040 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
1f050 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20   int *pnEntry,  
1f060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f070 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c  objects currentl
1f080 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y in use */.  in
1f090 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  t *pIdx         
1f0a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64  /* Write the ind
1f0b0 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74  ex of a new slot
1f0c0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   here */.){.  ch
1f0d0 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33  ar *z;.  sqlite3
1f0e0 5f 69 6e 74 36 34 20 6e 20 3d 20 2a 70 49 64 78  _int64 n = *pIdx
1f0f0 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69   = *pnEntry;.  i
1f100 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d  f( (n & (n-1))==
1f110 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1f120 5f 69 6e 74 36 34 20 73 7a 20 3d 20 28 6e 3d 3d  _int64 sz = (n==
1f130 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1f140 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1f150 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1f160 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73  db, pArray, sz*s
1f170 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
1f180 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1f190 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
1f1a0 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
1f1b0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  y;.    }.    pAr
1f1c0 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
1f1d0 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
1f1e0 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
1f1f0 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  [n * szEntry], 0
1f200 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2b 2b  , szEntry);.  ++
1f210 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
1f220 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
1f230 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1f240 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1f250 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
1f260 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
1f270 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1f280 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
1f290 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1f2a0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
1f2b0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1f2c0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1f2d0 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61 72 73  dListAppend(Pars
1f2e0 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69 73  e *pParse, IdLis
1f2f0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
1f300 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c 69  *pToken){.  sqli
1f310 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1f320 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
1f330 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1f340 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1f350 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1f360 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
1f370 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
1f380 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1f390 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1f3a0 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  >a = sqlite3Arra
1f3b0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1f3c0 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74   db,.      pList
1f3d0 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
1f3e0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
1f3f0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
1f400 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  d,.      &i.  );
1f410 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
1f420 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1f430 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1f440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1f450 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
1f460 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1f470 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1f480 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
1f490 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1f4a0 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69  CT && pList->a[i
1f4b0 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ].zName ){.    s
1f4c0 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
1f4d0 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
1f4e0 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  id*)pList->a[i].
1f4f0 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a  zName, pToken);.
1f500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
1f510 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
1f520 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
1f530 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
1f540 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1f550 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1f560 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1f570 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1f580 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1f590 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1f5a0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
1f5b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f5c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1f5d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1f5e0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1f5f0 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
1f600 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
1f610 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
1f620 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
1f630 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
1f640 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
1f650 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
1f660 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
1f670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
1f680 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
1f690 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
1f6a0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
1f6b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1f6c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
1f6d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f6e0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1f6f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1f700 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
1f710 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
1f720 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1f730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1f740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  ;.}../*.** Maxim
1f750 75 6d 20 73 69 7a 65 20 6f 66 20 61 20 53 72 63  um size of a Src
1f760 4c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  List object..** 
1f770 54 68 65 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  The SrcList obje
1f780 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
1f790 70 72 65 73 65 6e 74 20 74 68 65 20 46 52 4f 4d  present the FROM
1f7a0 20 63 6c 61 75 73 65 20 6f 66 20 61 0a 2a 2a 20   clause of a.** 
1f7b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1f7c0 2c 20 61 6e 64 20 74 68 65 20 71 75 65 72 79 20  , and the query 
1f7d0 70 6c 61 6e 6e 65 72 20 63 61 6e 6e 6f 74 20 64  planner cannot d
1f7e0 65 61 6c 20 77 69 74 68 20 6d 6f 72 65 0a 2a 2a  eal with more.**
1f7f0 20 74 68 61 6e 20 36 34 20 74 61 62 6c 65 73 20   than 64 tables 
1f800 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 53 6f 20 61  in a join.  So a
1f810 6e 79 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20  ny value larger 
1f820 74 68 61 6e 20 36 34 20 68 65 72 65 0a 2a 2a 20  than 64 here.** 
1f830 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f  is sufficient fo
1f840 72 20 6d 6f 73 74 20 75 73 65 73 2e 20 20 53 6d  r most uses.  Sm
1f850 61 6c 6c 65 72 20 76 61 6c 75 65 73 2c 20 6c 69  aller values, li
1f860 6b 65 20 73 61 79 20 31 30 2c 20 61 72 65 0a 2a  ke say 10, are.*
1f870 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
1f880 72 20 73 6d 61 6c 6c 20 61 6e 64 20 6d 65 6d 6f  r small and memo
1f890 72 79 2d 6c 69 6d 69 74 65 64 20 61 70 70 6c 69  ry-limited appli
1f8a0 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 6e  cations..*/.#ifn
1f8b0 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  def SQLITE_MAX_S
1f8c0 52 43 4c 49 53 54 0a 23 20 64 65 66 69 6e 65 20  RCLIST.# define 
1f8d0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49  SQLITE_MAX_SRCLI
1f8e0 53 54 20 32 30 30 0a 23 65 6e 64 69 66 0a 0a 2f  ST 200.#endif../
1f8f0 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1f900 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1f910 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1f920 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1f930 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1f940 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1f950 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1f960 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1f970 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1f980 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1f990 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1f9a0 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1f9b0 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1f9c0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1f9d0 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1f9e0 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1f9f0 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1fa00 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1fa10 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1fa20 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1fa30 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1fa40 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1fa50 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1fa60 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1fa70 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1fa80 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1fa90 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1faa0 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1fab0 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1fac0 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1fad0 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1fae0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1faf0 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1fb00 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1fb10 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1fb20 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1fb30 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1fb40 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1fb50 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1fb60 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1fb70 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1fb80 6c 73 20 6f 72 20 74 68 65 20 53 72 63 4c 69 73  ls or the SrcLis
1fb90 74 20 62 65 63 6f 6d 65 73 20 74 6f 6f 20 6c 61  t becomes too la
1fba0 72 67 65 2c 20 6c 65 61 76 65 0a 2a 2a 20 74 68  rge, leave.** th
1fbb0 65 20 6f 72 69 67 69 6e 61 6c 20 53 72 63 4c 69  e original SrcLi
1fbc0 73 74 20 75 6e 63 68 61 6e 67 65 64 2c 20 72 65  st unchanged, re
1fbd0 74 75 72 6e 20 4e 55 4c 4c 2c 20 61 6e 64 20 6c  turn NULL, and l
1fbe0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1fbf0 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
1fc00 73 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  se..*/.SrcList *
1fc10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1fc20 6c 61 72 67 65 28 0a 20 20 50 61 72 73 65 20 2a  large(.  Parse *
1fc30 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
1fc40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 69  arsing context i
1fc50 6e 74 6f 20 77 68 69 63 68 20 65 72 72 6f 72 73  nto which errors
1fc60 20 61 72 65 20 72 65 70 6f 72 74 65 64 20 2a 2f   are reported */
1fc70 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1fc80 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
1fc90 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
1fca0 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
1fcb0 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
1fcc0 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
1fcd0 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
1fce0 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
1fcf0 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
1fd00 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
1fd10 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
1fd20 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
1fd30 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
1fd40 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
1fd50 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
1fd60 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
1fd70 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
1fd80 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
1fd90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1fda0 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
1fdb0 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
1fdc0 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
1fdd0 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
1fde0 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
1fdf0 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1fe00 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1fe10 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
1fe20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
1fe30 4e 65 77 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  New;.    sqlite3
1fe40 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d 20  _int64 nAlloc = 
1fe50 32 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  2*(sqlite3_int64
1fe60 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74  )pSrc->nSrc+nExt
1fe70 72 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  ra;.    sqlite3 
1fe80 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1fe90 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ;..    if( pSrc-
1fea0 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53 51  >nSrc+nExtra>=SQ
1feb0 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54  LITE_MAX_SRCLIST
1fec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1fed0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1fee0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 46 52 4f 4d  , "too many FROM
1fef0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2c 20 6d   clause terms, m
1ff00 61 78 3a 20 25 64 22 2c 0a 20 20 20 20 20 20 20  ax: %d",.       
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1ff20 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
1ff30 54 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  T);.      return
1ff40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1ff50 28 20 6e 41 6c 6c 6f 63 3e 53 51 4c 49 54 45 5f  ( nAlloc>SQLITE_
1ff60 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 20 6e 41  MAX_SRCLIST ) nA
1ff70 6c 6c 6f 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  lloc = SQLITE_MA
1ff80 58 5f 53 52 43 4c 49 53 54 3b 0a 20 20 20 20 70  X_SRCLIST;.    p
1ff90 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1ffa0 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
1ffb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ffc0 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
1ffd0 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
1ffe0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
1fff0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
20000 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20010 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20020 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
20030 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
20040 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pSrc = pNew;.   
20050 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pSrc->nAlloc = 
20060 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 2f  nAlloc;.  }..  /
20070 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
20080 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
20090 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
200a0 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
200b0 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
200c0 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
200d0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
200e0 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
200f0 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
20100 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
20110 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
20120 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20  c += nExtra;..  
20130 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
20140 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
20150 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
20160 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
20170 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
20180 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
20190 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
201a0 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
201b0 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
201c0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
201d0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
201e0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
201f0 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
20200 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
20210 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
20220 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
20230 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
20240 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
20250 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
20260 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
20270 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
20280 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
20290 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
202a0 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
202b0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
202c0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
202d0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
202e0 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
202f0 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 53  r or if the.** S
20300 72 63 4c 69 73 74 20 67 72 6f 77 73 20 74 6f 20  rcList grows to 
20310 6c 61 72 67 65 2e 20 20 54 68 65 20 72 65 74 75  large.  The retu
20320 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
20330 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
20340 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
20350 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
20360 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
20370 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
20380 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
20390 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
203a0 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
203b0 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
203c0 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
203d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
203e0 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
203f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
20400 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
20410 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
20420 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
20430 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
20440 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
20450 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
20460 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
20470 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
20480 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
20490 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
204a0 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
204b0 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
204c0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
204d0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
204e0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
204f0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
20500 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
20510 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
20520 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
20530 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
20540 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
20550 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
20560 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
20570 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
20580 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
20590 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
205a0 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
205b0 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
205c0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
205d0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
205e0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
205f0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
20600 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
20610 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
20620 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
20630 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
20640 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
20650 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
20660 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
20670 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
20680 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
20690 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
206a0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
206b0 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
206c0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
206d0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
206e0 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
206f0 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
20700 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
20710 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
20720 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
20730 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
20740 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
20750 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
20760 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
20770 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
20780 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
20790 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
207a0 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
207b0 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
207c0 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
207d0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
207e0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
207f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
20800 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
20810 67 20 63 6f 6e 74 65 78 74 2c 20 69 6e 20 77 68  g context, in wh
20820 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20 72  ich errors are r
20830 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72 63  eported */.  Src
20840 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
20850 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
20860 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
20870 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
20880 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
20890 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
208a0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
208b0 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
208c0 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
208d0 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
208e0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
208f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20900 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
20910 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
20920 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( pDatabase==0 |
20930 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20  | pTable!=0 );  
20940 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43  /* Cannot have C
20950 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20   without B */.  
20960 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
20970 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20980 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
20990 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
209a0 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  b;.  if( pList==
209b0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
209c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
209d0 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  RawNN(pParse->db
209e0 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  , sizeof(SrcList
209f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
20a00 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
20a10 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
20a20 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69  loc = 1;.    pLi
20a30 73 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  st->nSrc = 1;.  
20a40 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
20a50 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[0], 0, sizeof
20a60 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
20a70 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
20a80 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
20a90 7d 65 6c 73 65 7b 0a 20 20 20 20 53 72 63 4c 69  }else{.    SrcLi
20aa0 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  st *pNew = sqlit
20ab0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
20ac0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
20ad0 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
20ae0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
20af0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20b00 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
20b10 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
20b20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
20b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
20b40 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  t = pNew;.    }.
20b50 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
20b60 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
20b70 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
20b80 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
20b90 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
20ba0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
20bb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
20bc0 62 61 73 65 20 29 7b 0a 20 20 20 20 70 49 74 65  base ){.    pIte
20bd0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
20be0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
20bf0 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
20c00 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61      pItem->zData
20c10 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
20c20 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
20c30 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
20c40 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
20c50 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
20c60 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
20c70 61 62 6c 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  able);.    pItem
20c80 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
20c90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
20ca0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
20cb0 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
20cc0 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
20cd0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
20ce0 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
20cf0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20d00 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
20d10 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
20d20 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
20d30 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
20d40 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
20d50 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
20d60 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
20d70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20d80 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
20d90 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
20da0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
20db0 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
20dc0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
20dd0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
20de0 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
20df0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
20e00 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
20e10 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
20e20 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
20e30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20e40 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
20e50 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
20e60 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
20e70 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
20e80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20e90 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
20ea0 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
20eb0 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
20ec0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
20ed0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
20ee0 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
20ef0 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
20f00 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
20f10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20f20 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
20f30 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
20f40 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
20f50 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
20f60 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
20f70 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
20f80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20f90 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
20fa0 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
20fb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
20fc0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
20fd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20fe0 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
20ff0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
21000 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
21010 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
21020 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a  (db, pItem->u1.z
21030 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
21040 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
21050 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65  TabFunc ) sqlite
21060 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
21070 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  db, pItem->u1.pF
21080 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  uncArg);.    sql
21090 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
210a0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  db, pItem->pTab)
210b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
210c0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  ectDelete(db, pI
210d0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
210e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
210f0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
21100 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
21110 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
21120 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  , pItem->pUsing)
21130 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
21140 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
21150 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
21160 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21170 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
21180 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
21190 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
211a0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
211b0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
211c0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
211d0 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
211e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
211f0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
21200 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
21210 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
21220 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
21230 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
21240 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21250 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
21260 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
21270 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
21280 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
21290 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
212a0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
212b0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
212c0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
212d0 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
212e0 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
212f0 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
21300 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
21310 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20  m has an alias, 
21320 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
21330 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
21340 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
21350 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
21360 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
21370 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
21380 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
21390 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
213a0 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
213b0 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
213c0 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
213d0 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
213e0 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
213f0 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
21400 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
21410 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
21420 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
21430 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
21440 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
21450 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
21460 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
21470 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
21480 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
21490 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
214a0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
214b0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
214c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
214d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
214e0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
214f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21500 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
21510 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
21520 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
21530 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
21540 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
21550 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
21560 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
21570 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
21580 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
21590 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
215a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
215b0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
215c0 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
215d0 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
215e0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
215f0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
21600 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
21610 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
21620 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
21630 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
21640 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
21650 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
21660 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
21670 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
21680 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
21690 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
216a0 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
216b0 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
216c0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
216d0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
216e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
216f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21700 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
21710 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
21720 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
21730 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21740 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
21750 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
21760 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
21770 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
21780 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
21790 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
217a0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
217b0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
217c0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50  SrcListAppend(pP
217d0 61 72 73 65 2c 20 70 2c 20 70 54 61 62 6c 65 2c  arse, p, pTable,
217e0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
217f0 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67  f( p==0 ){.    g
21800 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
21810 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73  error;.  }.  ass
21820 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29  ert( p->nSrc>0 )
21830 3b 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  ;.  pItem = &p->
21840 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
21850 61 73 73 65 72 74 28 20 28 70 54 61 62 6c 65 3d  assert( (pTable=
21860 3d 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65 3d  =0)==(pDatabase=
21870 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
21880 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
21890 20 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d 30   || pDatabase!=0
218a0 20 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e   );.  if( IN_REN
218b0 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 49  AME_OBJECT && pI
218c0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
218d0 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20    Token *pToken 
218e0 3d 20 28 41 4c 57 41 59 53 28 70 44 61 74 61 62  = (ALWAYS(pDatab
218f0 61 73 65 29 20 26 26 20 70 44 61 74 61 62 61 73  ase) && pDatabas
21900 65 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61 73  e->z) ? pDatabas
21910 65 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e : pTable;.    
21920 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
21930 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70 49  enMap(pParse, pI
21940 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b  tem->zName, pTok
21950 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  en);.  }.  asser
21960 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a  t( pAlias!=0 );.
21970 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20    if( pAlias->n 
21980 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41  ){.    pItem->zA
21990 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
219a0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
219b0 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70  pAlias);.  }.  p
219c0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
219d0 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74  pSubquery;.  pIt
219e0 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20  em->pOn = pOn;. 
219f0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d   pItem->pUsing =
21a00 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72   pUsing;.  retur
21a10 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72  n p;.. append_fr
21a20 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65  om_error:.  asse
21a30 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71  rt( p==0 );.  sq
21a40 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
21a50 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69  db, pOn);.  sqli
21a60 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
21a70 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73  db, pUsing);.  s
21a80 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
21a90 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79  te(db, pSubquery
21aa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
21ab0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49  ../*.** Add an I
21ac0 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54  NDEXED BY or NOT
21ad0 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
21ae0 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  to the most rece
21af0 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65  ntly added .** e
21b00 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f  lement of the so
21b10 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64  urce-list passed
21b20 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
21b30 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
21b40 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49   sqlite3SrcListI
21b50 6e 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a  ndexedBy(Parse *
21b60 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
21b70 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65  *p, Token *pInde
21b80 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74  xedBy){.  assert
21b90 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20  ( pIndexedBy!=0 
21ba0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 49  );.  if( p && pI
21bb0 6e 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b  ndexedBy->n>0 ){
21bc0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
21bd0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
21bf0 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70 49  nSrc>0 );.    pI
21c00 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
21c10 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
21c20 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
21c30 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
21c40 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
21c50 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
21c60 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
21c70 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
21c80 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
21c90 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
21ca0 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
21cb0 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
21cc0 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
21cd0 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
21ce0 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
21cf0 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
21d00 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
21d10 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
21d20 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
21d30 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
21d40 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
21d50 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  {.      pItem->u
21d60 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
21d70 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
21d80 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
21d90 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  pIndexedBy);.   
21da0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49     pItem->fg.isI
21db0 6e 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20 20  ndexedBy = 1;.  
21dc0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
21dd0 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66   Add the list of
21de0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
21df0 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69  nts to the SrcLi
21e00 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a  st entry for a.*
21e10 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66  * table-valued-f
21e20 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
21e30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46   sqlite3SrcListF
21e40 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a 70  uncArgs(Parse *p
21e50 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
21e60 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  p, ExprList *pLi
21e70 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  st){.  if( p ){.
21e80 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
21e90 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
21ea0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
21eb0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
21ec0 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
21ed0 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
21ee0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
21ef0 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
21f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
21f10 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
21f20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  c==0 );.    pIte
21f30 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
21f40 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   pList;.    pIte
21f50 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
21f60 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
21f70 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
21f80 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
21f90 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  db, pList);.  }.
21fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75  }../*.** When bu
21fb0 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d  ilding up a FROM
21fc0 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70   clause in the p
21fd0 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20  arser, the join 
21fe0 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  operator.** is i
21ff0 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65  nitially attache
22000 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70  d to the left op
22010 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20  erand.  But the 
22020 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
22030 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f  * expects the jo
22040 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  in operator to b
22050 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f  e on the right o
22060 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
22070 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20  utine.** Shifts 
22080 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  all join operato
22090 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  rs from left to 
220a0 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74  right for an ent
220b0 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75  ire FROM.** clau
220c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  se..**.** Exampl
220d0 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a  e: Suppose the j
220e0 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73  oin is like this
220f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
22100 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73    A natural cros
22110 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54  s join B.**.** T
22120 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22  he operator is "
22130 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
22140 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20  in".  The A and 
22150 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73  B operands are s
22160 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61  tored.** in p->a
22170 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c  [0] and p->a[1],
22180 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
22190 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69  The parser initi
221a0 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a  ally stores the.
221b0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  ** operator with
221c0 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   A.  This routin
221d0 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70  e shifts that op
221e0 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42  erator over to B
221f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22200 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
22210 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70  nType(SrcList *p
22220 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
22230 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
22240 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  (i=p->nSrc-1; i>
22250 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
22260 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[i].fg.jointy
22270 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66  pe = p->a[i-1].f
22280 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
22290 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67  }.    p->a[0].fg
222a0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
222b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
222c0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
222d0 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  or a BEGIN state
222e0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
222f0 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
22300 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
22310 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
22320 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
22330 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
22340 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  i;..  assert( pP
22350 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20  arse!=0 );.  db 
22360 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22370 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
22380 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
22390 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
223a0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
223b0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
223c0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
223d0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
223e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
223f0 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
22400 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
22410 65 3d 3d 54 4b 5f 49 4d 4d 45 44 49 41 54 45 20  e==TK_IMMEDIATE 
22420 7c 7c 20 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  || type==TK_EXCL
22430 55 53 49 56 45 20 29 7b 0a 20 20 20 20 66 6f 72  USIVE ){.    for
22440 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
22450 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
22460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22470 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
22480 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
22490 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
224a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
224b0 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a  sesBtree(v, i);.
224c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
224d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
224e0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
224f0 30 2c 20 30 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  0, 0, (type==TK_
22500 43 4f 4e 43 55 52 52 45 4e 54 29 29 3b 0a 7d 0a  CONCURRENT));.}.
22510 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
22520 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
22530 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
22540 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CK statement..**
22550 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41   Code for ROLLBA
22560 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  CK is generated 
22570 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c  if eType==TK_ROL
22580 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77 69 73  LBACK.  Otherwis
22590 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e  e.** code is gen
225a0 65 72 61 74 65 64 20 66 6f 72 20 61 20 43 4f 4d  erated for a COM
225b0 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  MIT..*/.void sql
225c0 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74 69  ite3EndTransacti
225d0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
225e0 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20  , int eType){.  
225f0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
22600 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73  sRollback;..  as
22610 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
22620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
22630 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
22640 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 54  assert( eType==T
22650 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70  K_COMMIT || eTyp
22660 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79  e==TK_END || eTy
22670 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20  pe==TK_ROLLBACK 
22680 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20  );.  isRollback 
22690 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  = eType==TK_ROLL
226a0 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69  BACK;.  if( sqli
226b0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
226c0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
226d0 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20  SACTION, .      
226e0 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52   isRollback ? "R
226f0 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d  OLLBACK" : "COMM
22700 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
22710 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
22720 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
22730 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
22740 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
22750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22760 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
22770 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20  , isRollback);. 
22780 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
22790 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
227a0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
227b0 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
227c0 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
227d0 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
227e0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
227f0 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
22800 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
22810 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
22820 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
22830 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
22840 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
22850 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
22860 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
22870 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
22880 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
22890 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
228a0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
228b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
228c0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
228d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
228e0 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
228f0 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
22900 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
22910 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
22920 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
22930 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
22940 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
22950 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22960 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
22970 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
22980 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22990 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
229a0 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
229b0 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
229c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
229d0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
229e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
229f0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
22a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
22a10 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
22a20 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
22a30 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
22a40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
22a50 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
22a60 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
22a70 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
22a80 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
22a90 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
22aa0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
22ab0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
22ac0 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
22ad0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
22ae0 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
22af0 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
22b00 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
22b10 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22b20 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
22b30 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
22b40 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
22b50 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
22b60 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
22b70 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
22b80 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
22b90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
22ba0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
22bb0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
22bc0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
22bd0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22be0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
22bf0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
22c00 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
22c10 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
22c20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
22c30 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
22c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
22c50 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
22c60 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
22c70 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
22c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22c90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22ca0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
22cb0 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
22cc0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
22cd0 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
22ce0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
22cf0 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
22d00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
22d10 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
22d20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
22d30 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
22d40 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
22d50 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
22d60 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
22d70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
22d80 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
22d90 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
22da0 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
22db0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
22dc0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
22dd0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22de0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
22df0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22e00 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
22e10 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
22e20 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
22e30 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
22e40 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
22e50 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
22e60 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
22e70 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
22e80 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
22e90 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
22ea0 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
22eb0 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
22ec0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
22ed0 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
22ee0 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
22ef0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
22f00 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
22f10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
22f20 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
22f30 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
22f40 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
22f50 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 61 73  l(pParse);..  as
22f60 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
22f70 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
22f80 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
22f90 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
22fa0 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
22fb0 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  iDb==1 );.  asse
22fc0 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
22fd0 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
22fe0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22ff0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
23000 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 69 44  d(pParse->db, iD
23010 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44  b, 0) );.  if( D
23020 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65  bMaskTest(pTople
23030 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
23040 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20   iDb)==0 ){.    
23050 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
23060 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
23070 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
23080 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
23090 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db==1 ){.      s
230a0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
230b0 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c  tabase(pToplevel
230c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
230d0 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
230e0 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74  t zDb is NULL, t
230f0 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
23100 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
23110 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  () for each .** 
23120 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
23130 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  e. Otherwise, in
23140 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20  voke it for the 
23150 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a  database named z
23160 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  Db only..*/.void
23170 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23180 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61  fyNamedSchema(Pa
23190 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
231a0 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
231b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
231c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
231d0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
231e0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
231f0 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
23200 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
23210 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28  f( pDb->pBt && (
23220 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  !zDb || 0==sqlit
23230 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70  e3StrICmp(zDb, p
23240 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29  Db->zDbSName)) )
23250 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
23260 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
23270 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
23280 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
23290 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
232a0 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
232b0 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
232c0 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
232d0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
232e0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
232f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
23300 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
23310 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
23320 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
23330 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
23340 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
23350 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
23360 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
23370 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
23380 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
23390 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
233a0 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
233b0 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
233c0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
233d0 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
233e0 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
233f0 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
23400 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
23410 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
23420 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
23430 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
23440 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
23450 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
23460 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
23470 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
23480 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
23490 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
234a0 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
234b0 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
234c0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
234d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
234e0 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
234f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
23500 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
23510 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
23520 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
23530 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23540 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
23550 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
23560 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
23570 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
23580 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
23590 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
235a0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
235b0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
235c0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
235d0 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61  se, iDb);.  DbMa
235e0 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d  skSet(pToplevel-
235f0 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29  >writeMask, iDb)
23600 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
23610 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73  sMultiWrite |= s
23620 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a  etStatement;.}..
23630 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
23640 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
23650 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  t currently unde
23660 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d  r construction m
23670 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f  ight write.** mo
23680 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72  re than one entr
23690 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65  y (example: dele
236a0 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65  ting one row the
236b0 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74  n inserting anot
236c0 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e  her,.** insertin
236d0 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  g multiple rows 
236e0 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69  in a table, or i
236f0 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61  nserting a row a
23700 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
23710 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72  .).** If an abor
23720 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73  t occurs after s
23730 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69  ome of these wri
23740 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74  tes have complet
23750 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ed, then it will
23760 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
23770 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d   to undo the com
23780 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a  pleted writes..*
23790 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75  /.void sqlite3Mu
237a0 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a  ltiWrite(Parse *
237b0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
237c0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
237d0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
237e0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
237f0 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
23800 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Write = 1;.}../*
23810 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65   .** The code ge
23820 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68  nerator calls th
23830 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73  is routine if is
23840 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
23850 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  it is.** possibl
23860 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61  e to abort a sta
23870 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20  tement prior to 
23880 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20  completion.  In 
23890 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72  order to .** per
238a0 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20  form this abort 
238b0 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69  without corrupti
238c0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
238d0 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
238e0 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68  .** sure that th
238f0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  e statement is p
23900 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74  rotected by a st
23910 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
23920 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e  ion..**.** Techn
23930 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20  ically, we only 
23940 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  need to set the 
23950 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66  mayAbort flag if
23960 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57   the.** isMultiW
23970 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72  rite flag was pr
23980 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54  eviously set.  T
23990 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64  here is a time d
239a0 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63  ependency.** suc
239b0 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74  h that the abort
239c0 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65   must occur afte
239d0 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65  r the multiwrite
239e0 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a  .  This makes.**
239f0 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73   some statements
23a00 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52   involving the R
23a10 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
23a20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
23a30 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74  ithm.** go a lit
23a40 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74  tle faster.  But
23a50 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67   taking advantag
23a60 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64  e of this time d
23a70 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b  ependency.** mak
23a80 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69  es it more diffi
23a90 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68  cult to prove th
23aa0 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63  at the code is c
23ab0 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70  orrect (in .** p
23ac0 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72  articular, it pr
23ad0 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77  events us from w
23ae0 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74  riting an effect
23af0 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ive.** implement
23b00 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ation of sqlite3
23b10 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
23b20 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65  ) and so we have
23b30 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61   chosen.** to ta
23b40 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74  ke the safe rout
23b50 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f  e and skip the o
23b60 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a  ptimization..*/.
23b70 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41  void sqlite3MayA
23b80 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72  bort(Parse *pPar
23b90 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
23ba0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
23bb0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
23bc0 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
23bd0 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20  vel->mayAbort = 
23be0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  1;.}../*.** Code
23bf0 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74   an OP_Halt that
23c00 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65   causes the vdbe
23c10 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51   to return an SQ
23c20 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a  LITE_CONSTRAINT.
23c30 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e  ** error. The on
23c40 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20  Error parameter 
23c50 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
23c60 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65   (if any) of the
23c70 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
23c80 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61  d/or current tra
23c90 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
23ca0 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ed back..*/.void
23cb0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
23cc0 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
23cd0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
23ce0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23cf0 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  /.  int errCode,
23d00 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65        /* extende
23d10 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  d error code */.
23d20 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
23d30 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
23d40 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  t type */.  char
23d50 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a   *p4,         /*
23d60 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   Error message *
23d70 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20  /.  i8 p4type,  
23d80 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54        /* P4_STAT
23d90 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45  IC or P4_TRANSIE
23da0 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72  NT */.  u8 p5Err
23db0 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f  msg       /* P5_
23dc0 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29  ErrMsg type */.)
23dd0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
23de0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
23df0 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
23e00 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  (errCode&0xff)==
23e10 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
23e20 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  T );.  if( onErr
23e30 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  or==OE_Abort ){.
23e40 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
23e50 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
23e60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
23e70 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
23e80 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f   errCode, onErro
23e90 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
23ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
23eb0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72  ChangeP5(v, p5Er
23ec0 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rmsg);.}../*.** 
23ed0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
23ee0 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72  due to UNIQUE or
23ef0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
23f00 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
23f10 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
23f20 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69  e3UniqueConstrai
23f30 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
23f40 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
23f50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
23f60 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
23f70 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
23f80 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  type */.  Index 
23f90 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54  *pIdx       /* T
23fa0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72  he index that tr
23fb0 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74  iggers the const
23fc0 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  raint */.){.  ch
23fd0 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20  ar *zErr;.  int 
23fe0 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72  j;.  StrAccum er
23ff0 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70  rMsg;.  Table *p
24000 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
24010 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74  le;..  sqlite3St
24020 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d  rAccumInit(&errM
24030 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20  sg, pParse->db, 
24040 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
24060 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
24070 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
24080 47 54 48 5d 29 3b 0a 20 20 69 66 28 20 70 49 64  GTH]);.  if( pId
24090 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
240a0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
240b0 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20  ppendf(&errMsg, 
240c0 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49  "index '%q'", pI
240d0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  dx->zName);.  }e
240e0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  lse{.    for(j=0
240f0 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
24100 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; j++){.      c
24110 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
24120 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
24130 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
24140 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54  .      zCol = pT
24150 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
24160 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
24170 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29  e;.      if( j )
24180 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
24190 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
241a0 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
241b0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
241c0 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62  ll(&errMsg, pTab
241d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
241e0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
241f0 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c  nd(&errMsg, ".",
24200 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
24210 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
24220 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b  (&errMsg, zCol);
24230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72  .    }.  }.  zEr
24240 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  r = sqlite3StrAc
24250 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73  cumFinish(&errMs
24260 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c  g);.  sqlite3Hal
24270 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
24280 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61  se, .    IsPrima
24290 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
242a0 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   ? SQLITE_CONSTR
242b0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20  AINT_PRIMARYKEY 
242c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53               : S
242e0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
242f0 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
24300 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
24310 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
24320 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
24330 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
24340 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
24350 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
24360 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24370 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
24380 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24390 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
243a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
243b0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
243c0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
243d0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
243e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
243f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
24400 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
24410 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
24420 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
24430 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
24440 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
24450 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
24460 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
24470 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
24480 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
24490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
244a0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
244b0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
244c0 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
244d0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
244e0 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
244f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
24500 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
24510 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
24520 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
24530 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
24540 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
24550 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
24560 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
24570 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
24580 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
24590 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
245c0 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
245d0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
245e0 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
245f0 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
24600 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
24610 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
24620 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
24630 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
24640 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
24650 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
24660 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
24670 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
24680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
24690 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
246a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
246b0 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
246c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
246d0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
246e0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
246f0 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
24700 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
24710 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
24720 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
24730 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
24740 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
24750 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
24760 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
24770 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
24780 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
24790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
247a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
247b0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
247c0 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
247d0 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
247e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
247f0 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
24800 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
24810 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
24820 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
24830 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
24840 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
24850 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
24860 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
24870 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
24880 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
24890 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
248a0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 49 6e  (pTab) ){.    In
248b0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
248c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
248d0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
248e0 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
248f0 20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54     for(pIndex=pT
24900 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
24910 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
24920 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
24930 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
24940 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
24950 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
24960 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
24970 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
24980 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
24990 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
249a0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ma);.        sql
249b0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
249c0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
249d0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  0, iDb);.       
249e0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
249f0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
24a00 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  ex, -1);.      }
24a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
24a20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
24a30 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
24a40 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
24a50 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
24a60 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
24a70 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
24a80 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
24a90 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
24aa0 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
24ab0 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
24ac0 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
24ad0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24ae0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
24af0 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
24b00 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
24b10 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
24b20 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
24b30 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
24b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
24b50 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
24b60 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
24b90 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
24ba0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24bb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
24bc0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
24bd0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
24be0 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
24bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
24c00 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
24c10 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
24c20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c40 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
24c50 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
24c60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
24c70 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
24c80 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65  es(db) );  /* Ne
24c90 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  eded for schema 
24ca0 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28  access */.  for(
24cb0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
24cc0 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
24cd0 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
24ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
24cf0 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
24d00 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
24d10 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
24d20 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
24d30 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
24d40 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
24d50 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
24d60 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
24d70 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
24d80 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
24d90 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
24da0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
24db0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24dc0 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
24dd0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
24de0 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
24e10 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
24e20 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
24e30 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
24e40 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
24e50 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
24e60 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
24e70 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
24e80 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
24e90 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
24ea0 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
24eb0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
24ec0 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
24ed0 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
24ee0 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
24ef0 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
24f00 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
24f10 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
24f20 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
24f30 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
24f40 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
24f50 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
24f60 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
24f70 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
24f80 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
24f90 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
24fa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24fb0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
24fc0 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
24fd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
24fe0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
24ff0 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
25000 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
25010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25020 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
25030 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
25040 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
25050 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
25060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25070 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
25080 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
25090 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
250a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
250b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
250c0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
250d0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
250e0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
250f0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
25100 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25120 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
25130 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
25140 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
25170 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
25180 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25190 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
251a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
251b0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
251c0 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
251d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
251e0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
251f0 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
25200 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
25210 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
25220 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
25230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
25240 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
25250 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
25260 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
25270 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
25280 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
25290 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
252a0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
252b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
252c0 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
252d0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
252e0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
252f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
25300 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
25310 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
25320 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
25330 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
25340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
25350 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
25360 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
25370 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
25380 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
25390 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
253a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
253b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
253c0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
253d0 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
253e0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
253f0 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
25400 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
25410 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
25420 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25430 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
25440 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
25450 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25460 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
25470 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
25480 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
25490 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
254a0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
254b0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
254c0 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
254d0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
254e0 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
254f0 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
25500 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
25510 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
25520 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
25530 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
25540 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
25550 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
25560 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
25570 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
25580 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25590 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
255a0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
255b0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
255c0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
255d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
255e0 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   z);.  if( pInde
255f0 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
25600 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
25610 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
25620 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
25630 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
25640 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
25650 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
25660 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
25670 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
25680 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
25690 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
256a0 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
256b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
256c0 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  urn a KeyInfo st
256d0 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
256e0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
256f0 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e  the given Index.
25700 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
25710 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  r should invoke 
25720 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
25730 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74  ref() on the ret
25740 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20  urned object.** 
25750 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69  when it has fini
25760 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a  shed using it..*
25770 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
25780 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
25790 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
257a0 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
257b0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
257c0 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
257d0 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  n;.  int nKey = 
257e0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
257f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a   KeyInfo *pKey;.
25800 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
25810 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
25820 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e   if( pIdx->uniqN
25830 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b  otNull ){.    pK
25840 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
25850 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
25860 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d  >db, nKey, nCol-
25870 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
25880 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
25890 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
258a0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c  Parse->db, nCol,
258b0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   0);.  }.  if( p
258c0 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
258d0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
258e0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
258f0 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  y) );.    for(i=
25900 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
25910 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
25920 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
25930 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
25940 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
25950 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65   = zColl==sqlite
25960 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a  3StrBINARY ? 0 :
25970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25980 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25990 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
259a0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
259b0 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
259c0 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e  rder[i] = pIdx->
259d0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
259e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
259f0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
25a00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
25a10 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  e->rc==SQLITE_ER
25a20 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c  ROR_MISSING_COLL
25a30 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28  SEQ );.      if(
25a40 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d   pIdx->bNoQuery=
25a50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
25a60 20 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20   Deactivate the 
25a70 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74  index because it
25a80 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b   contains an unk
25a90 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20  nown collating. 
25aa0 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e         ** sequen
25ab0 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61  ce.  The only wa
25ac0 79 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68  y to reactive th
25ad0 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65  e index is to re
25ae0 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20  load the.       
25af0 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64   ** schema.  Add
25b00 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20  ing the missing 
25b10 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
25b20 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f  ce later does no
25b30 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  t.        ** rea
25b40 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e  ctive the index.
25b50 20 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f    The applicatio
25b60 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65  n had the chance
25b70 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20   to register.   
25b80 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73       ** the miss
25b90 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20  ing index using 
25ba0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65  the collation-ne
25bb0 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20  eded callback.  
25bc0 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  For.        ** s
25bd0 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74  implicity, SQLit
25be0 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20  e will not give 
25bf0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
25c00 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e  a second chance.
25c10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25c20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65      pIdx->bNoQue
25c30 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ry = 1;.        
25c40 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
25c50 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b  ITE_ERROR_RETRY;
25c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
25c70 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
25c80 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ef(pKey);.      
25c90 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pKey = 0;.    }.
25ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65    }.  return pKe
25cb0 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  y;.}..#ifndef SQ
25cc0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
25cd0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
25ce0 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  e is invoked onc
25cf0 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65  e per CTE by the
25d00 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61   parser while pa
25d10 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48  rsing a .** WITH
25d20 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74   clause. .*/.Wit
25d30 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64  h *sqlite3WithAd
25d40 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
25d50 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
25d60 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
25d70 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
25d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25d90 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c  Existing WITH cl
25da0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
25db0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
25dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
25dd0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  me of the common
25de0 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  -table */.  Expr
25df0 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20  List *pArglist, 
25e00 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20      /* Optional 
25e10 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74  column name list
25e20 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
25e30 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65  /.  Select *pQue
25e40 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ry          /* Q
25e50 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69  uery used to ini
25e60 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
25e70 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
25e80 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
25e90 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77  db;.  With *pNew
25ea0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
25eb0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
25ec0 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69  t the CTE name i
25ed0 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20  s unique within 
25ee0 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65  this WITH clause
25ef0 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73  . If.  ** not, s
25f00 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  tore an error in
25f10 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
25f20 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65  ture. */.  zName
25f30 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
25f40 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
25f50 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
25f60 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68  ( zName && pWith
25f70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
25f80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
25f90 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
25fa0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
25fb0 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
25fc0 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61   pWith->a[i].zNa
25fd0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
25fe0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25ff0 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
26000 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20  cate WITH table 
26010 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  name: %s", zName
26020 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26030 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74  .  }..  if( pWit
26040 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
26050 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
26060 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20  izeof(*pWith) + 
26070 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61  (sizeof(pWith->a
26080 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43  [1]) * pWith->nC
26090 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  te);.    pNew = 
260a0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
260b0 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74  (db, pWith, nByt
260c0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
260d0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
260e0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
260f0 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b  sizeof(*pWith));
26100 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
26110 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65  pNew!=0 && zName
26120 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  !=0) || db->mall
26130 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69  ocFailed );..  i
26140 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26150 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
26160 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
26170 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a  (db, pArglist);.
26180 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26190 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65  tDelete(db, pQue
261a0 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
261b0 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
261c0 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57  );.    pNew = pW
261d0 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ith;.  }else{.  
261e0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
261f0 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20  nCte].pSelect = 
26200 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77  pQuery;.    pNew
26210 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
26220 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74  pCols = pArglist
26230 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
26240 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20  ew->nCte].zName 
26250 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65  = zName;.    pNe
26260 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
26270 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  .zCteErr = 0;.  
26280 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a    pNew->nCte++;.
26290 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e    }..  return pN
262a0 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
262b0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
262c0 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  f the With objec
262d0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
262e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
262f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26300 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74  WithDelete(sqlit
26310 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57  e3 *db, With *pW
26320 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
26330 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
26340 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
26350 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
26360 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43  {.      struct C
26370 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
26380 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
26390 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
263a0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
263b0 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
263c0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
263d0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
263e0 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
263f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74  e3DbFree(db, pCt
26400 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
26410 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26420 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20  ee(db, pWith);. 
26430 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
26440 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26450 4d 49 54 5f 43 54 45 29 20 2a 2f 0a              MIT_CTE) */.