/ Hex Artifact Content
Login

Artifact 2e9b0fc01bc1c23030c48e827125b06bcc3cc4893c1818497768392a83de4bfb:


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 78 70 72 65 73  ** If the expres
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 63 6f 6c 75 6d 6e 20 6e 75 6d  ue if column num
dbd0: 62 65 72 20 78 20 69 73 20 61 6e 79 20 6f 66 20  ber x is any of 
dbe0: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
dbf0: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
dc00: 5d 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  ]..** This is us
dc10: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
dc20: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  if the column nu
dc30: 6d 62 65 72 20 78 20 61 70 70 65 61 72 73 20 69  mber x appears i
dc40: 6e 20 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a 20  n any of the.** 
dc50: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
dc60: 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a  es of an index..
dc70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
dc80: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
dc90: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
dca0: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
dcb0: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
dcc0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
dcd0: 69 43 6f 6c 5b 30 5d 3e 3d 30 20 29 3b 0a 20 20  iCol[0]>=0 );.  
dce0: 20 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c    if( x==*(aiCol
dcf0: 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ++) ){.      ret
dd00: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
dd10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
dd20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
dd30: 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
dd40: 66 69 72 73 74 20 6e 4b 65 79 20 65 6e 74 72 69  first nKey entri
dd50: 65 73 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  es of index pIdx
dd60: 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6d 61 74 63   exactly.** matc
dd70: 68 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 65 6e  h the iCol-th en
dd80: 74 72 79 20 6f 66 20 70 50 6b 2e 20 20 70 50 6b  try of pPk.  pPk
dd90: 20 69 73 20 61 6c 77 61 79 73 20 61 20 57 49 54   is always a WIT
dda0: 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20 50 52  HOUT ROWID.** PR
ddb0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
ddc0: 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64    pIdx is an ind
ddd0: 65 78 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  ex on the same t
dde0: 61 62 6c 65 2e 20 20 70 49 64 78 20 6d 61 79 0a  able.  pIdx may.
ddf0: 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ** or may not be
de00: 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
de10: 61 73 20 70 50 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  as pPk..**.** Th
de20: 65 20 66 69 72 73 74 20 6e 4b 65 79 20 65 6e 74  e first nKey ent
de30: 72 69 65 73 20 6f 66 20 70 49 64 78 20 61 72 65  ries of pIdx are
de40: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
de50: 65 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d  e ordinary colum
de60: 6e 73 2c 0a 2a 2a 20 6e 6f 74 20 61 20 72 6f 77  ns,.** not a row
de70: 69 64 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  id or expression
de80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
de90: 74 69 6e 65 20 64 69 66 66 65 72 73 20 66 72 6f  tine differs fro
dea0: 6d 20 68 61 73 43 6f 6c 75 6d 6e 28 29 20 69 6e  m hasColumn() in
deb0: 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 63   that both the c
dec0: 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 0a 2a 2a  olumn and the.**
ded0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
dee0: 6e 63 65 20 6d 75 73 74 20 6d 61 74 63 68 20 66  nce must match f
def0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  or this routine,
df00: 20 62 75 74 20 66 6f 72 20 68 61 73 43 6f 6c 75   but for hasColu
df10: 6d 6e 28 29 20 6f 6e 6c 79 0a 2a 2a 20 74 68 65  mn() only.** the
df20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6d 75 73   column name mus
df30: 74 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74  t match..*/.stat
df40: 69 63 20 69 6e 74 20 69 73 44 75 70 43 6f 6c 75  ic int isDupColu
df50: 6d 6e 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  mn(Index *pIdx, 
df60: 69 6e 74 20 6e 4b 65 79 2c 20 49 6e 64 65 78 20  int nKey, Index 
df70: 2a 70 50 6b 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  *pPk, int iCol){
df80: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61  .  int i, j;.  a
df90: 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d 70 49 64  ssert( nKey<=pId
dfa0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
dfb0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3c 4d 41 58  assert( iCol<MAX
dfc0: 28 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2c 70 50  (pPk->nColumn,pP
dfd0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 20 29 3b 0a 20  k->nKeyCol) );. 
dfe0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 69 64   assert( pPk->id
dff0: 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
e000: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
e010: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e020: 6b 2d 3e 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c  k->pTable->tabFl
e030: 61 67 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  ags & TF_Without
e040: 52 6f 77 69 64 20 29 3b 0a 20 20 61 73 73 65 72  Rowid );.  asser
e050: 74 28 20 70 50 6b 2d 3e 70 54 61 62 6c 65 3d 3d  t( pPk->pTable==
e060: 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 29 3b 0a  pIdx->pTable );.
e070: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 6b 3d    testcase( pPk=
e080: 3d 70 49 64 78 20 29 3b 0a 20 20 6a 20 3d 20 70  =pIdx );.  j = p
e090: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  Pk->aiColumn[iCo
e0a0: 6c 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 21  l];.  assert( j!
e0b0: 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 6a 21 3d  =XN_ROWID && j!=
e0c0: 58 4e 5f 45 58 50 52 20 29 3b 0a 20 20 66 6f 72  XN_EXPR );.  for
e0d0: 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b  (i=0; i<nKey; i+
e0e0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
e0f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
e100: 5d 3e 3d 30 20 7c 7c 20 6a 3e 3d 30 20 29 3b 0a  ]>=0 || j>=0 );.
e110: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
e120: 43 6f 6c 75 6d 6e 5b 69 5d 3d 3d 6a 20 0a 20 20  Column[i]==j .  
e130: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
e140: 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c  ICmp(pIdx->azCol
e150: 6c 5b 69 5d 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c  l[i], pPk->azCol
e160: 6c 5b 69 43 6f 6c 5d 29 3d 3d 30 0a 20 20 20 20  l[iCol])==0.    
e170: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e180: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
e190: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 0;.}../* R
e1a0: 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c  ecompute the col
e1b0: 4e 6f 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f  NotIdxed field o
e1c0: 66 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a  f the Index..**.
e1d0: 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69  ** colNotIdxed i
e1e0: 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
e1f0: 20 68 61 73 20 61 20 30 20 62 69 74 20 72 65 70   has a 0 bit rep
e200: 72 65 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69  resenting each i
e210: 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e  ndexed.** column
e220: 73 20 74 68 61 74 20 61 72 65 20 77 69 74 68 69  s that are withi
e230: 6e 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63  n the first 63 c
e240: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
e250: 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67  ble.  The.** hig
e260: 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63  h-order bit of c
e270: 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c  olNotIdxed is al
e280: 77 61 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69  ways 1.  All uni
e290: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a  ndexed columns.*
e2a0: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68  * of the table h
e2b0: 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ave a 1..**.** T
e2c0: 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d  he colNotIdxed m
e2d0: 61 73 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69  ask is AND-ed wi
e2e0: 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61  th the SrcList.a
e2f0: 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a  [].colUsed mask.
e300: 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
e310: 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
e320: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
e330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
e340: 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e  ecomputeColumnsN
e350: 6f 74 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20  otIndexed(Index 
e360: 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
e370: 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
e380: 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
e390: 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
e3a0: 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
e3b0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
e3c0: 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
e3d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
e3e0: 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
e3f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e400: 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
e410: 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
e420: 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
e430: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
e440: 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64  Idx->colNotIdxed
e450: 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28   = ~m;.  assert(
e460: 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64   (pIdx->colNotId
e470: 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d  xed>>63)==1 );.}
e480: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e490: 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65  tine runs at the
e4a0: 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20   end of parsing 
e4b0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e4c0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a  tatement that.**
e4d0: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
e4e0: 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68  OWID clause.  Th
e4f0: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
e500: 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76  utine is to conv
e510: 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65  ert both.** inte
e520: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61  rnal schema data
e530: 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20   structures and 
e540: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44  the generated VD
e550: 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20  BE code so that 
e560: 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72  they.** are appr
e570: 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49  opriate for a WI
e580: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
e590: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72  e instead of a r
e5a0: 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43  owid table..** C
e5b0: 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a  hanges include:.
e5c0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53  **.**     (1)  S
e5d0: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
e5e0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
e5f0: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
e600: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
e610: 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76  **     (2)  Conv
e620: 65 72 74 20 50 33 20 70 61 72 61 6d 65 74 65 72  ert P3 parameter
e630: 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74   of the OP_Creat
e640: 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45  eBtree from BTRE
e650: 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20  E_INTKEY .**    
e660: 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45        into BTREE
e670: 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20  _BLOBKEY..**    
e680: 20 28 33 29 20 20 42 79 70 61 73 73 20 74 68 65   (3)  Bypass the
e690: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
e6a0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e6b0: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
e6c0: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
e6d0: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
e6e0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
e6f0: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
e700: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
e710: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
e720: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
e730: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
e740: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
e750: 34 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  4)  Set the Inde
e760: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
e770: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
e780: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
e790: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
e7a0: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
e7b0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
e7c0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29  able..**     (5)
e7d0: 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20    Add all table 
e7e0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
e7f0: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
e800: 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20   object.**      
e810: 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20      so that the 
e820: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61  PRIMARY KEY is a
e830: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
e840: 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a    The surplus.**
e850: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
e860: 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65  s are part of Ke
e870: 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20  yInfo.nAllField 
e880: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
e890: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
e8a0: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
e8b0: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
e8c0: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
e8d0: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
e8e0: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
e8f0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
e900: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
e910: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
e920: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
e930: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
e940: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69  ns..**.** For vi
e950: 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e  rtual tables, on
e960: 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72  ly (1) is perfor
e970: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  med..*/.static v
e980: 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  oid convertToWit
e990: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50  houtRowidTable(P
e9a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
e9b0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
e9c0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64  dex *pIdx;.  Ind
e9d0: 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e  ex *pPk;.  int n
e9e0: 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Pk;.  int i, j;.
e9f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ea00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
ea10: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ea20: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
ea30: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
ea40: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
ea50: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
ea60: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
ea70: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
ea80: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
ea90: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
eaa0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
eab0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
eac0: 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
ead0: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
eae0: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
eaf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
eb00: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
eb10: 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
eb20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eb30: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
eb40: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f  the P3 operand o
eb50: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
eb60: 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d  tree opcode from
eb70: 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20   BTREE_INTKEY.  
eb80: 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c  ** into BTREE_BL
eb90: 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  OBKEY..  */.  if
eba0: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
ebb0: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
ebc0: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
ebd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
ebe0: 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  v, pParse->addrC
ebf0: 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42  rTab, BTREE_BLOB
ec00: 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KEY);.  }..  /* 
ec10: 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41  Locate the PRIMA
ec20: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f  RY KEY index.  O
ec30: 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  r, if this table
ec40: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
ec50: 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20    ** an INTEGER 
ec60: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c  PRIMARY KEY tabl
ec70: 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  e, create a new 
ec80: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
ec90: 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x. .  */.  if( p
eca0: 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
ecb0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
ecc0: 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  List;.    Token 
ecd0: 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71  ipkToken;.    sq
ece0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
ecf0: 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e  ipkToken, pTab->
ed00: 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
ed10: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
ed20: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
ed30: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
ed40: 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  se, 0, .        
ed50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed60: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
ed70: 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c  K_ID, &ipkToken,
ed80: 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
ed90: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
eda0: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
edb0: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
edc0: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
edd0: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
ede0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  e, pList->a[0].p
edf0: 45 78 70 72 2c 20 26 70 54 61 62 2d 3e 69 50 4b  Expr, &pTab->iPK
ee00: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
ee10: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
ee20: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
ee30: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
ee40: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
ee50: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
ee60: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   );.    pTab->iP
ee70: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Key = -1;.    sq
ee80: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
ee90: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
eea0: 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b  , pList, pTab->k
eeb0: 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c  eyConf, 0, 0, 0,
eec0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
eed0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
eee0: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
eef0: 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64  YKEY);.    if( d
ef00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ef10: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
ef20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50  ) return;.    pP
ef30: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
ef40: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
ef50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ef60: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
ef70: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
ef80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ef90: 50 6b 21 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  Pk!=0 );..    /*
efa0: 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61  .    ** Remove a
efb0: 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  ll redundant col
efc0: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52  umns from the PR
efd0: 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20  IMARY KEY.  For 
efe0: 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a  example, change.
eff0: 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20      ** "PRIMARY 
f000: 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c  KEY(a,b,a,b,c,b,
f010: 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20  c,d)" into just 
f020: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
f030: 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20  ,c,d)".  Later. 
f040: 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d     ** code assum
f050: 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  es the PRIMARY K
f060: 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  EY contains no r
f070: 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  epeated columns.
f080: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
f090: 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b  i=j=1; i<pPk->nK
f0a0: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
f0b0: 20 20 20 69 66 28 20 69 73 44 75 70 43 6f 6c 75     if( isDupColu
f0c0: 6d 6e 28 70 50 6b 2c 20 6a 2c 20 70 50 6b 2c 20  mn(pPk, j, pPk, 
f0d0: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  i) ){.        pP
f0e0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20  k->nColumn--;.  
f0f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f100: 20 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73     testcase( has
f110: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
f120: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
f130: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20  Column[i]) );.  
f140: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
f150: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
f160: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
f170: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
f180: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
f190: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
f1a0: 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e  Pk!=0 );.  pPk->
f1b0: 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a  isCovering = 1;.
f1c0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
f1d0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20  imposterTable ) 
f1e0: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
f1f0: 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50   = 1;.  nPk = pP
f200: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
f210: 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65  * Bypass the cre
f220: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49  ation of the PRI
f230: 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61  MARY KEY btree a
f240: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  nd the sqlite_ma
f250: 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
f260: 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f  entry. This is o
f270: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20  nly required if 
f280: 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61  currently genera
f290: 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63  ting VDBE.  ** c
f2a0: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
f2b0: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
f2c0: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
f2d0: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
f2e0: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
f2f0: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69  schema).  */.  i
f300: 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75  f( v && pPk->tnu
f310: 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  m>0 ){.    asser
f320: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
f330: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
f340: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
f350: 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c  de(v, pPk->tnum,
f360: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a   OP_Goto);.  }..
f370: 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
f380: 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ge of the PRIMAR
f390: 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62  Y KEY is the tab
f3a0: 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  le root page */.
f3b0: 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54    pPk->tnum = pT
f3c0: 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20  ab->tnum;..  /* 
f3d0: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
f3e0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
f3f0: 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55  ion of all UNIQU
f400: 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e  E indices by con
f410: 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  verting.  ** the
f420: 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c   final rowid col
f430: 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  umn into one or 
f440: 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
f450: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
f460: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
f470: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
f480: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
f4a0: 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69  n;.    if( IsPri
f4b0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
f4c0: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
f4d0: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
f4e0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
f4f0: 20 69 66 28 20 21 69 73 44 75 70 43 6f 6c 75 6d   if( !isDupColum
f500: 6e 28 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  n(pIdx, pIdx->nK
f510: 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 69 29 20 29  eyCol, pPk, i) )
f520: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
f530: 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49  se( hasColumn(pI
f540: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
f550: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
f560: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
f570: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
f580: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f590: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
f5a0: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
f5b0: 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f   is a superset o
f5c0: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
f5d0: 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d  y */.      pIdx-
f5e0: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d  >nColumn = pIdx-
f5f0: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
f600: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
f610: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
f620: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49  dexObject(db, pI
f630: 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  dx, pIdx->nKeyCo
f640: 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l+n) ) return;. 
f650: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49     for(i=0, j=pI
f660: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e  dx->nKeyCol; i<n
f670: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
f680: 69 66 28 20 21 69 73 44 75 70 43 6f 6c 75 6d 6e  if( !isDupColumn
f690: 28 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65  (pIdx, pIdx->nKe
f6a0: 79 43 6f 6c 2c 20 70 50 6b 2c 20 69 29 20 29 7b  yCol, pPk, i) ){
f6b0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f6c0: 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  e( hasColumn(pId
f6d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
f6e0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
f6f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b  >aiColumn[i]) );
f700: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
f710: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
f720: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
f730: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
f740: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
f750: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
f760: 20 69 66 28 20 70 50 6b 2d 3e 61 53 6f 72 74 4f   if( pPk->aSortO
f770: 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
f780: 20 20 20 20 20 2f 2a 20 53 65 65 20 74 69 63 6b       /* See tick
f790: 65 74 20 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73  et https://www.s
f7a0: 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
f7b0: 66 6f 2f 62 62 61 37 62 36 39 66 39 38 34 39 62  fo/bba7b69f9849b
f7c0: 35 62 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  5bf */.         
f7d0: 20 70 49 64 78 2d 3e 62 41 73 63 4b 65 79 42 75   pIdx->bAscKeyBu
f7e0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  g = 1;.        }
f7f0: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
f800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f810: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
f820: 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65  olumn>=pIdx->nKe
f830: 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73  yCol+n );.    as
f840: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
f850: 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20  umn>=j );.  }.. 
f860: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c   /* Add all tabl
f870: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
f880: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
f890: 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  ex.  */.  if( nP
f8a0: 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  k<pTab->nCol ){.
f8b0: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
f8c0: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50  dexObject(db, pP
f8d0: 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  k, pTab->nCol) )
f8e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
f8f0: 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
f900: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
f910: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
f920: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
f930: 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20  umn, j, i) ){.  
f940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
f950: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  pPk->nColumn );.
f960: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
f970: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20  olumn[j] = i;.  
f980: 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c        pPk->azCol
f990: 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[j] = sqlite3St
f9a0: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20  rBINARY;.       
f9b0: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
f9c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
f9d0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
f9e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f9f0: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
fa00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
fa10: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
fa20: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ->nCol;.  }.  re
fa30: 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
fa40: 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d  tIndexed(pPk);.}
fa50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fa60: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
fa70: 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  LE./*.** Return 
fa80: 74 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73  true if zName is
fa90: 20 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20   a shadow table 
faa0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72  name in the curr
fab0: 65 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ent database.** 
fac0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
fad0: 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f  * zName is tempo
fae0: 72 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20  rarily modified 
faf0: 77 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69  while this routi
fb00: 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62  ne is running, b
fb10: 75 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65  ut is.** restore
fb20: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
fb30: 6c 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f  l value prior to
fb40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
fb50: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
fb60: 69 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54  ic int isShadowT
fb70: 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33  ableName(sqlite3
fb80: 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d   *db, char *zNam
fb90: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69  e){.  char *zTai
fba0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
fbb0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
fbc0: 6f 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69  o the last "_" i
fbd0: 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62  n zName */.  Tab
fbe0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
fbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
fc00: 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69  ble that zName i
fc10: 73 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f  s a shadow of */
fc20: 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b  .  Module *pMod;
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74   /* Module for t
fc50: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
fc60: 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73   */..  zTail = s
fc70: 74 72 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f  trrchr(zName, '_
fc80: 27 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d  ');.  if( zTail=
fc90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fca0: 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70   *zTail = 0;.  p
fcb0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
fcc0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
fcd0: 2c 20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d  , 0);.  *zTail =
fce0: 20 27 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62   '_';.  if( pTab
fcf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fd00: 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
fd10: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
fd20: 30 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64  0;.  pMod = (Mod
fd30: 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ule*)sqlite3Hash
fd40: 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
fd50: 65 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  e, pTab->azModul
fd60: 65 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20  eArg[0]);.  if( 
fd70: 70 4d 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  pMod==0 ) return
fd80: 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e   0;.  if( pMod->
fd90: 70 4d 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f  pModule->iVersio
fda0: 6e 3c 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<3 ) return 0;.
fdb0: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64    if( pMod->pMod
fdc0: 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65  ule->xShadowName
fdd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fde0: 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70    return pMod->p
fdf0: 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e  Module->xShadowN
fe00: 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a  ame(zTail+1);.}.
fe10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69  #else.# define i
fe20: 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65  sShadowTableName
fe30: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f  (x,y) 0.#endif /
fe40: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
fe50: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fe60: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
fe70: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fe80: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
fe90: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
fea0: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
feb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
fec0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
fed0: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
fee0: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
fef0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
ff00: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
ff10: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
ff20: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
ff30: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
ff40: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
ff50: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
ff60: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
ff70: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
ff80: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
ff90: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
ffa0: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
ffb0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
ffc0: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
ffd0: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
ffe0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
fff0: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
10000 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
10010 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
10020 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
10030 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
10040 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
10050 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
10060 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
10070 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
10080 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
10090 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
100a0 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
100b0 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
100c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
100d0 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
100e0 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
100f0 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
10100 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
10110 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
10120 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
10130 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
10140 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
10150 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
10160 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
10170 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
10180 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
10190 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
101a0 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
101b0 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
101c0 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
101d0 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
101e0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
101f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
10200 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
10210 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10220 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
10230 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
10240 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
10250 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
10260 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
10270 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
10280 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
10290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
102a0 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
102b0 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
102c0 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
102d0 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
102e0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
102f0 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
10300 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
10310 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
10320 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
10330 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
10340 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
10350 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
10380 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
10390 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
103a0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
103b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
103c0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
103d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
103e0 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
103f0 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
10400 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10420 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
10430 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
10440 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  /..  if( pEnd==0
10450 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29   && pSelect==0 )
10460 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10470 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  }.  assert( !db-
10480 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10490 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
104a0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
104b0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
104c0 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
104d0 20 26 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c   && isShadowTabl
104e0 65 4e 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61  eName(db, p->zNa
104f0 6d 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61  me) ){.    p->ta
10500 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61  bFlags |= TF_Sha
10510 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dow;.  }..  /* I
10520 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
10530 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
10540 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
10550 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
10560 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
10570 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
10580 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
10590 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
105a0 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
105b0 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
105c0 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
105d0 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
105e0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
105f0 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
10600 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
10610 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
10620 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
10630 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
10640 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
10650 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
10660 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a   routine.).  **.
10670 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
10680 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
10690 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  1, that means th
106a0 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  is is the sqlite
106b0 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
106c0 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d  le itself.  So m
106d0 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ark it read-only
106e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
106f0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10700 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
10710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10720 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10730 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
10750 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
10760 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20  ewTnum;.    if( 
10770 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e  p->tnum==1 ) p->
10780 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52  tabFlags |= TF_R
10790 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20  eadonly;.  }..  
107a0 61 73 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46  assert( (p->tabF
107b0 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
107c0 6d 61 72 79 4b 65 79 29 3d 3d 30 0a 20 20 20 20  maryKey)==0.    
107d0 20 20 20 7c 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d     || p->iPKey>=
107e0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 72 69 6d  0 || sqlite3Prim
107f0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 21 3d  aryKeyIndex(p)!=
10800 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
10810 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
10820 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 21  _HasPrimaryKey)!
10830 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 2d  =0.       || (p-
10840 3e 69 50 4b 65 79 3c 30 20 26 26 20 73 71 6c 69  >iPKey<0 && sqli
10850 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
10860 65 78 28 70 29 3d 3d 30 29 20 29 3b 0a 0a 20 20  ex(p)==0) );..  
10870 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65  /* Special proce
10880 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55  ssing for WITHOU
10890 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a  T ROWID Tables *
108a0 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20  /.  if( tabOpts 
108b0 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  & TF_WithoutRowi
108c0 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  d ){.    if( (p-
108d0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
108e0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b  utoincrement) ){
108f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10900 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
10910 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e           "AUTOIN
10920 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f  CREMENT not allo
10930 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52  wed on WITHOUT R
10940 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20  OWID tables");. 
10950 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10960 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74   }.    if( (p->t
10970 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
10980 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29  PrimaryKey)==0 )
10990 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
109a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
109b0 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73  "PRIMARY KEY mis
109c0 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73  sing on table %s
109d0 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
109e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
109f0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
10a00 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20  _WithoutRowid | 
10a10 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
10a20 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74  d;.      convert
10a30 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
10a40 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ble(pParse, p);.
10a50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62      }.  }..  iDb
10a60 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10a70 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
10a80 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
10a90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
10aa0 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
10ab0 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
10ac0 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
10ad0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
10ae0 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
10af0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
10b00 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
10b10 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e  nce(pParse, p, N
10b20 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d  C_IsCheck, 0, p-
10b30 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65  >pCheck);.  }.#e
10b40 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10b50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
10b60 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74  CK) */..  /* Est
10b70 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
10b80 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74  e row size for t
10b90 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72  he table and for
10ba0 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64   all implied ind
10bb0 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61  ices */.  estima
10bc0 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b  teTableWidth(p);
10bd0 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70  .  for(pIdx=p->p
10be0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
10bf0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
10c00 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65      estimateInde
10c10 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20  xWidth(pIdx);.  
10c20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
10c30 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
10c40 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
10c50 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
10c60 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
10c70 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
10c80 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
10c90 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
10ca0 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
10cb0 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
10cc0 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
10cd0 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
10ce0 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
10cf0 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
10d00 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
10d10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
10d20 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
10d30 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
10d40 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
10d50 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
10d60 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
10d70 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
10d80 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
10d90 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
10da0 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
10db0 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
10dc0 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
10dd0 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
10de0 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
10df0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10e00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
10e10 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
10e20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
10e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10e40 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
10e50 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
10e60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
10e70 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
10e80 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
10e90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
10ea0 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
10eb0 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
10ec0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
10ed0 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
10ee0 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
10ef0 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
10f00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10f10 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
10f20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
10f30 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
10f40 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
10f50 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
10f60 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
10f70 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
10f80 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
10f90 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
10fa0 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
10fb0 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
10fc0 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
10fd0 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
10fe0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
10ff0 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
11000 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
11010 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
11020 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
11030 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
11040 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
11050 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
11060 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
11070 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
11080 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
11090 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
110a0 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
110b0 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
110c0 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
110d0 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
110e0 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
110f0 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
11100 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
11110 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
11120 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
11130 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
11140 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
11150 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
11160 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
11170 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
11180 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
11190 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
111a0 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
111b0 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
111c0 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
111d0 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
111e0 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
111f0 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
11200 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a  Dest dest;    /*
11210 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
11220 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72  T should store r
11230 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
11240 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20  int regYield;   
11250 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11260 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69  holding co-routi
11270 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a  ne entry-point *
11280 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
11290 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
112a0 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
112b0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
112c0 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
112d0 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f    /* A record to
112e0 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   be insert into 
112f0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
11300 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f  .      int regRo
11310 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  wid;       /* Ro
11320 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20  wid of the next 
11330 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  row to insert */
11340 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
11350 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f  nsLoop;    /* To
11360 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  p of the loop fo
11370 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73  r inserting rows
11380 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
11390 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a  *pSelTab;     /*
113a0 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65   A table that de
113b0 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45  scribes the SELE
113c0 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  CT results */.. 
113d0 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20       regYield = 
113e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
113f0 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b        regRec = +
11400 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11410 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
11420 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11430 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
11440 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
11450 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
11460 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
11470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11480 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
11490 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
114a0 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
114b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
114c0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
114d0 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20  FLAG_P2ISREG);. 
114e0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
114f0 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64  b = 2;.      add
11500 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
11510 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11520 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
11530 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11540 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
11550 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
11560 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
11570 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
11580 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
11590 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
115a0 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
115b0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
115c0 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
115d0 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
115e0 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
115f0 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
11600 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .      p->nCol =
11610 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
11620 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
11630 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
11640 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
11650 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
11660 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
11670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11680 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
11690 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71  elTab);.      sq
116a0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
116b0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
116c0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
116d0 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
116e0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
116f0 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
11700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
11710 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
11720 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
11730 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
11740 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  (v, regYield);. 
11750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11760 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11770 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  Top - 1);.      
11780 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71  addrInsLoop = sq
11790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
117a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
117b0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
117c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
117d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
117e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
117f0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73  _MakeRecord, des
11800 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53  t.iSdst, dest.nS
11810 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  dst, regRec);.  
11820 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
11830 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30  Affinity(v, p, 0
11840 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11850 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11860 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65  _NewRowid, 1, re
11870 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
11880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11890 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31  (v, OP_Insert, 1
118a0 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
118b0 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
118c0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
118d0 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
118e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
118f0 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73  pHere(v, addrIns
11900 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
11910 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11920 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
11930 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
11940 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
11950 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
11960 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
11970 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
11980 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
11990 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
119a0 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
119b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b  }else{.      Tok
119c0 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f  en *pEnd2 = tabO
119d0 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73  pts ? &pParse->s
119e0 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64  LastToken : pEnd
119f0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  ;.      n = (int
11a00 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61  )(pEnd2->z - pPa
11a10 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
11a20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  z);.      if( pE
11a30 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29  nd2->z[0]!=';' )
11a40 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a   n += pEnd2->n;.
11a50 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
11a60 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
11a70 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
11a80 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
11a90 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
11aa0 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
11ab0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
11ac0 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
11ad0 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
11ae0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
11af0 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
11b00 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
11b10 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
11b20 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
11b30 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
11b40 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
11b50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
11b60 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
11b70 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
11b80 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
11b90 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
11ba0 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
11bb0 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
11bc0 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
11bd0 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
11be0 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
11bf0 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
11c00 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
11c10 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
11c20 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
11c30 45 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  E,.      zType,.
11c40 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
11c50 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
11c60 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
11c70 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
11c80 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
11c90 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
11ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
11cb0 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
11cc0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
11cd0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
11ce0 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
11cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
11d00 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
11d10 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
11d20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
11d30 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
11d40 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
11d50 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
11d60 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
11d70 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
11d80 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  /.    if( (p->ta
11d90 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
11da0 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b  increment)!=0 ){
11db0 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
11dc0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
11dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
11de0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
11df0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
11e00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
11e10 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
11e20 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
11e30 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
11e40 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
11e50 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
11e60 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
11e70 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
11e80 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
11e90 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20  b->zDbSName.    
11ea0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
11eb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
11ec0 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
11ed0 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
11ee0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
11ef0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
11f00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11f10 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
11f20 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
11f30 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
11f40 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
11f50 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d  ='%q' AND type!=
11f60 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a  'trigger'", p->z
11f70 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20  Name));.  }...  
11f80 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
11f90 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
11fa0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
11fb0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11fc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
11fd0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
11fe0 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
11ff0 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
12000 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
12010 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
12020 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
12030 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
12040 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
12050 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
12060 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
12070 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b  h, p->zName, p);
12080 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
12090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
120a0 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
120b0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
120c0 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
120d0 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
120e0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
120f0 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
12100 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
12110 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12120 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d  e = 0;.    db->m
12130 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
12140 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
12150 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12160 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
12170 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
12180 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
12190 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
121a0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
121b0 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
121c0 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
121d0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
121e0 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
121f0 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
12200 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
12210 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
12220 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
12230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
12240 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e  ame = (int)((con
12250 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d  st char *)pCons-
12260 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >z - zName);.   
12270 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
12280 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
12290 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
122a0 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
122b0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
122c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
122d0 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
122e0 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
122f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
12300 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
12310 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
12320 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
12330 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
12340 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
12350 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
12360 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
12370 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
12380 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
12390 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
123a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
123b0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
123c0 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
123d0 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
123e0 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
123f0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
12400 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
12410 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
12420 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
12430 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  w */.  ExprList 
12440 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74  *pCNames, /* Opt
12450 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69  ional list of vi
12460 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ew column names 
12470 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
12480 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
12490 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
124a0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
124b0 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
124c0 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
124d0 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
124e0 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
124f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
12500 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
12510 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
12520 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
12530 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
12540 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
12550 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
12560 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
12570 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
12580 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
12590 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
125a0 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
125b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
125c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
125d0 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
125e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
125f0 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
12600 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
12610 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
12620 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
12630 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71  w_fail;.  }.  sq
12640 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
12650 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
12660 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
12670 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
12680 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
12690 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
126a0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
126b0 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  r ) goto create_
126c0 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c  view_fail;.  sql
126d0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
126e0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
126f0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
12700 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
12710 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
12720 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
12730 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
12740 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
12750 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
12760 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
12770 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
12780 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74  , pSelect) ) got
12790 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
127a0 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  il;..  /* Make a
127b0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
127c0 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
127d0 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
127e0 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
127f0 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
12800 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
12810 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
12820 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
12830 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
12840 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
12850 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
12860 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
12870 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
12880 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
12890 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
128a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
128b0 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
128c0 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  /.  if( IN_RENAM
128d0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
128e0 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
128f0 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63  lect;.    pSelec
12900 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
12910 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
12920 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
12930 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
12940 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
12950 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20    }.  p->pCheck 
12960 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12970 74 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73  tDup(db, pCNames
12980 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
12990 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
129a0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
129b0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
129c0 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  l;..  /* Locate 
129d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
129e0 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
129f0 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
12a00 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
12a10 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
12a20 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
12a30 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  astToken;.  asse
12a40 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  rt( sEnd.z[0]!=0
12a50 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b   || sEnd.n==0 );
12a60 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
12a70 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
12a80 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
12a90 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
12aa0 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
12ab0 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
12ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
12ad0 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  );.  z = pBegin-
12ae0 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  >z;.  while( sql
12af0 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
12b00 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
12b10 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
12b20 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
12b30 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
12b40 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
12b50 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
12b60 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
12b70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
12b80 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
12b90 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c  se, 0, &sEnd, 0,
12ba0 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65   0);..create_vie
12bb0 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65  w_fail:.  sqlite
12bc0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
12bd0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  , pSelect);.  if
12be0 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
12bf0 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CT ){.    sqlite
12c00 33 52 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55  3RenameExprlistU
12c10 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 43 4e  nmap(pParse, pCN
12c20 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ames);.  }.  sql
12c30 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
12c40 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b  te(db, pCNames);
12c50 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
12c60 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12c70 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20  IT_VIEW */..#if 
12c80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12c90 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
12ca0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12cb0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
12cc0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
12cd0 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
12ce0 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
12cf0 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
12d00 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
12d10 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
12d20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
12d30 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
12d40 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
12d50 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
12d60 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
12d70 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
12d80 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
12d90 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
12da0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
12db0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
12dc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
12dd0 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
12de0 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
12df0 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
12e00 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
12e10 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
12e20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
12e30 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
12e40 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
12e50 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
12e60 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
12e70 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
12e80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
12e90 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
12ea0 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
12eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
12ec0 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
12ed0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
12ee0 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20  rs assigned */. 
12ef0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12f00 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
12f10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12f20 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72  on for malloc er
12f30 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rors */.#ifndef 
12f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12f50 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 72  UALTABLE.  int r
12f60 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  c;.#endif.#ifnde
12f70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12f80 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71  THORIZATION.  sq
12f90 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
12fa0 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
12fb0 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
12fc0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
12fd0 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
12fe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12ff0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13000 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  .  db->nSchemaLo
13010 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ck++;.  rc = sql
13020 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e  ite3VtabCallConn
13030 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
13040 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65  le);.  db->nSche
13050 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20  maLock--;.  if( 
13060 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
13070 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73   1;.  }.  if( Is
13080 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
13090 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
130a0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
130b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
130c0 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
130d0 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
130e0 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
130f0 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
13100 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
13110 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
13120 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
13130 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
13140 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
13150 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
13160 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
13170 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
13180 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
13190 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
131a0 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
131b0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
131c0 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
131d0 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
131e0 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
131f0 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
13200 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
13210 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
13220 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
13230 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
13240 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
13250 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
13260 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
13270 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
13280 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
13290 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
132a0 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
132b0 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
132c0 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
132d0 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
132e0 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
132f0 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
13300 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
13310 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
13320 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
13330 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
13340 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
13350 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
13360 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
13370 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
13380 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13390 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
133a0 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
133b0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
133c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
133d0 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
133e0 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
133f0 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
13400 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
13410 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
13420 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
13430 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
13440 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
13450 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
13460 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
13470 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
13480 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
13490 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
134a0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
134b0 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
134c0 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
134d0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
134e0 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
134f0 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
13500 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
13510 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
13520 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
13530 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
13540 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
13550 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
13560 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
13570 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
13580 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
13590 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
135a0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
135b0 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
135c0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
135d0 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
135e0 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
135f0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
13600 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
13610 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
13620 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  el ){.#ifndef SQ
13630 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
13640 41 42 4c 45 0a 20 20 20 20 75 38 20 65 50 61 72  ABLE.    u8 ePar
13650 73 65 4d 6f 64 65 20 3d 20 70 50 61 72 73 65 2d  seMode = pParse-
13660 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20  >eParseMode;.   
13670 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
13680 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45  ode = PARSE_MODE
13690 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a  _NORMAL;.#endif.
136a0 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
136b0 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
136c0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
136d0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
136e0 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
136f0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
13700 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
13710 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a  ide.bDisable++;.
13720 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13730 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
13740 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
13750 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
13760 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
13770 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
13780 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
13790 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
137a0 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
137b0 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20  = xAuth;.#else. 
137c0 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
137d0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
137e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
137f0 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
13800 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
13810 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
13820 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
13830 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
13840 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41   name(arglist) A
13850 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54  S ....      ** T
13860 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
13870 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
13880 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66  able are taken f
13890 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  rom.      ** arg
138a0 6c 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74  list which is st
138b0 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e  ored in pTable->
138c0 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68  pCheck.  The pCh
138d0 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20  eck field.      
138e0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64  ** normally hold
138f0 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  s CHECK constrai
13900 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61  nts on an ordina
13910 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f  ry table, but fo
13920 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45  r.      ** a VIE
13930 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c  W it holds the l
13940 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ist of column na
13950 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mes..      */.  
13960 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
13970 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
13980 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70  Parse, pTable->p
13990 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65           &pTable
139c0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d  ->nCol, &pTable-
139d0 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66  >aCol);.      if
139e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
139f0 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ed==0 .       &&
13a00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
13a10 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c  .       && pTabl
13a20 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70  e->nCol==pSel->p
13a30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20  EList->nExpr.   
13a40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
13a50 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
13a60 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
13a70 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
13a80 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ble, pSel);.    
13a90 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13aa0 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
13ab0 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45     /* CREATE VIE
13ac0 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69  W name AS...  wi
13ad0 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e  thout an argumen
13ae0 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75  t list.  Constru
13af0 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ct.      ** the 
13b00 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
13b10 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  m the SELECT sta
13b20 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
13b30 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
13b40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13b50 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
13b60 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
13b70 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
13b80 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
13b90 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
13ba0 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
13bb0 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
13bc0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
13bd0 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
13be0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13bf0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
13c00 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
13c10 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
13c20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13c30 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
13c40 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
13c50 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
13c60 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
13c70 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
13c80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13c90 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
13ca0 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
13cb0 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23  de.bDisable--;.#
13cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13cd0 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
13ce0 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65    pParse->eParse
13cf0 4d 6f 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64  Mode = eParseMod
13d00 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c  e;.#endif.  } el
13d10 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
13d20 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70  .  }.  pTable->p
13d30 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c  Schema->schemaFl
13d40 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
13d50 74 56 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62  tViews;.  if( db
13d60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13d70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  {.    sqlite3Del
13d80 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
13d90 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
13da0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
13db0 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
13dc0 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  ol = 0;.  }.#end
13dd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13de0 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
13df0 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
13e00 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
13e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13e20 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13e30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13e40 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
13e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13e60 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
13e70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
13e80 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
13e90 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
13ea0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
13eb0 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
13ec0 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
13ed0 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
13ee0 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
13ef0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
13f00 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
13f10 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
13f20 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
13f30 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
13f40 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
13f50 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
13f60 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
13f70 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
13f80 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
13f90 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
13fa0 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
13fb0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
13fc0 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
13fd0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
13fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13ff0 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
14000 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  s(db, pTab);.   
14010 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20     pTab->aCol = 
14020 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
14030 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
14040 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
14050 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
14060 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
14070 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
14080 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
14090 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
140a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
140b0 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
140c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
140d0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
140e0 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
140f0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
14100 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
14110 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
14120 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
14130 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
14140 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
14150 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
14160 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
14170 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
14180 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
14190 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
141a0 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
141b0 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
141c0 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
141d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
141e0 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
141f0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
14200 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
14210 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
14220 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
14230 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
14240 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
14250 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
14260 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
14270 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
14280 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
14290 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
142a0 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
142b0 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
142c0 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
142d0 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
142e0 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
142f0 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
14300 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
14310 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
14320 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
14330 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
14340 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
14350 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
14360 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
14370 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
14380 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
14390 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
143a0 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
143b0 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
143c0 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
143d0 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
143e0 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
143f0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
14400 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
14410 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
14420 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
14430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14440 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
14450 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
14460 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
14470 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f  nt iDb, int iFro
14480 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
14490 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
144a0 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20    Hash *pHash;. 
144b0 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
144c0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
144d0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
144e0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62  iDb, 0) );.  pDb
144f0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
14500 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ;.  pHash = &pDb
14510 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
14520 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
14530 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
14540 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
14550 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
14560 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
14570 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
14580 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
14590 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
145a0 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
145b0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
145c0 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
145d0 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
145e0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
145f0 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
14600 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
14610 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
14620 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
14630 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
14640 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
14650 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
14660 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
14670 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
14680 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
14690 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
146a0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
146b0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
146c0 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
146d0 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
146e0 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
146f0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
14700 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
14710 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
14720 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
14730 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
14740 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
14750 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
14760 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
14770 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
14780 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
14790 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
147a0 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
147b0 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
147c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
147d0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
147e0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
147f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14800 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
14810 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
14820 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14830 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
14840 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
14850 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
14860 20 69 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20   if( iTable<2 ) 
14870 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14880 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
14890 20 73 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c   schema");.  sql
148a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
148b0 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
148c0 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
148d0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
148e0 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
148f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14900 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
14910 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
14920 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
14930 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
14940 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
14950 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
14960 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
14970 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
14980 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
14990 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
149a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
149b0 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
149c0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
149d0 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
149e0 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
149f0 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
14a00 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
14a10 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
14a20 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
14a30 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
14a40 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
14a50 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
14a60 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
14a70 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
14a80 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
14a90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
14aa0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
14ab0 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
14ac0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
14ad0 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
14ae0 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
14af0 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
14b00 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
14b10 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
14b20 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
14b30 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
14b40 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
14b50 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
14b60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14b70 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
14b80 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
14b90 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
14ba0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
14bb0 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
14bc0 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
14bd0 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
14be0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
14bf0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
14c00 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
14c10 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
14c20 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
14c30 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
14c40 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
14c50 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
14c60 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
14c70 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
14c80 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
14c90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
14ca0 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
14cb0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
14cc0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
14cd0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
14ce0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
14cf0 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
14d00 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
14d10 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
14d20 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
14d30 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
14d40 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
14d50 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
14d60 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
14d70 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
14d80 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
14d90 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
14da0 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
14db0 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
14dc0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
14dd0 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
14de0 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
14df0 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
14e00 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
14e10 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
14e20 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
14e30 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
14e40 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
14e50 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
14e60 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
14e70 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
14e80 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
14e90 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
14ea0 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
14eb0 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
14ec0 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
14ed0 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
14ee0 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
14ef0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
14f00 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
14f10 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
14f20 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
14f30 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
14f40 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
14f50 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
14f60 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
14f70 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
14f80 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
14f90 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
14fa0 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
14fb0 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
14fc0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
14fd0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
14fe0 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
14ff0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
15000 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
15010 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
15020 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
15030 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
15040 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
15050 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
15060 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
15070 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
15080 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
15090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
150a0 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
150b0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
150c0 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
150d0 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
150e0 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
150f0 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
15100 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
15110 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
15120 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15130 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
15140 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
15150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15160 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
15170 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
15180 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
15190 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61  Schema);.      a
151a0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
151b0 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
151c0 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65  >nDb );.      de
151d0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
151e0 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
151f0 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
15200 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
15210 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
15220 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74  /*.** Remove ent
15230 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71  ries from the sq
15240 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
15250 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32  s (for N in (1,2
15260 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20  ,3)).** after a 
15270 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52  DROP INDEX or DR
15280 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
15290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
152a0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
152b0 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65  tTables(.  Parse
152c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
152d0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
152e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
152f0 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
15300 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
15310 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
15320 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
15330 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22  pe,     /* "idx"
15340 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63   or "tbl" */.  c
15350 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
15360 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
15370 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
15380 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
15390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
153a0 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64  Name = pParse->d
153b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
153c0 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Name;.  for(i=1;
153d0 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=4; i++){.   
153e0 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a   char zTab[24];.
153f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
15400 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62  intf(sizeof(zTab
15410 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73  ),zTab,"sqlite_s
15420 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69  tat%d",i);.    i
15430 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
15440 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
15450 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29  zTab, zDbName) )
15460 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
15470 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
15480 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
15490 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
154a0 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
154b0 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
154c0 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  b, zType, zName.
154d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
154e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
154f0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
15500 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
15510 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
15520 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
15530 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
15540 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
15550 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
15560 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
15570 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15580 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
15590 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
155a0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
155b0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
155c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
155d0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
155e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
155f0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
15600 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
15610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15620 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
15630 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
15640 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
15650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
15660 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
15670 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15680 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
15690 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
156a0 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
156b0 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
156c0 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
156d0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
156e0 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
156f0 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
15700 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
15710 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
15720 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
15730 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
15740 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
15750 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
15760 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
15770 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
15780 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
15790 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
157a0 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
157b0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
157c0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
157d0 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
157e0 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
157f0 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
15800 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
15810 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
15820 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15830 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
15840 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
15850 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
15860 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
15870 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
15880 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
15890 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
158a0 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
158b0 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
158c0 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
158d0 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
158e0 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
158f0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
15900 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
15910 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
15920 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
15930 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
15940 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
15950 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
15960 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
15970 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
15980 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
15990 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
159a0 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
159b0 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
159c0 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
159d0 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
159e0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c    pDb->zDbSName,
159f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
15a00 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
15a10 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
15a20 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
15a30 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
15a40 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
15a50 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  o the.  ** table
15a60 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
15a70 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
15a80 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
15a90 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
15aa0 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
15ab0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
15ac0 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
15ad0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
15ae0 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70  being.  ** dropp
15af0 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
15b00 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
15b10 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
15b20 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a  igger can be.  *
15b30 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
15b40 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
15b50 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
15b60 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
15b70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  .  ** database..
15b80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
15b90 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
15ba0 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  , .      "DELETE
15bb0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
15bc0 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
15bd0 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
15be0 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  '",.      pDb->z
15bf0 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
15c00 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  NAME, pTab->zNam
15c10 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
15c20 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
15c30 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
15c40 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
15c50 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
15c60 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
15c70 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
15c80 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
15c90 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
15ca0 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
15cb0 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
15cc0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
15cd0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
15ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15cf0 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
15d00 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
15d10 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
15d20 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
15d30 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
15d40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15d50 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
15d60 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
15d70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  ->zName, 0);.  s
15d80 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
15d90 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
15da0 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
15db0 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
15dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15dd0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
15de0 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
15df0 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
15e00 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
15e10 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
15e20 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
15e30 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
15e40 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
15e50 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
15e60 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
15e70 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
15e80 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
15e90 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
15ea0 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
15eb0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15ec0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
15ed0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15ee0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
15ef0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15f00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
15f10 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
15f20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
15f30 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
15f40 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
15f50 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
15f60 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15f70 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72  able;.  if( noEr
15f80 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
15f90 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  Err++;.  assert(
15fa0 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73   isView==0 || is
15fb0 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45  View==LOCATE_VIE
15fc0 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  W );.  pTab = sq
15fd0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
15fe0 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56  Item(pParse, isV
15ff0 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30  iew, &pName->a[0
16000 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  ]);.  if( noErr 
16010 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
16020 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  r--;..  if( pTab
16030 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
16040 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f  oErr ) sqlite3Co
16050 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
16060 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
16070 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
16080 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
16090 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
160a0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
160b0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
160c0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
160d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
160e0 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
160f0 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Db );..  /* If p
16100 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c  Tab is a virtual
16110 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65   table, call Vie
16120 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
16130 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a  ) to ensure.  **
16140 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
16150 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ed..  */.  if( I
16160 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
16170 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  & sqlite3ViewGet
16180 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
16190 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
161a0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
161b0 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64  table;.  }.#ifnd
161c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
161d0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
161e0 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
161f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16200 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
16210 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  LE(iDb);.    con
16220 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
16230 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
16240 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
16250 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
16260 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16270 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16280 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
16290 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
162a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
162b0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
162c0 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
162d0 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
162e0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
162f0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
16300 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
16310 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
16320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16330 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
16340 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
16350 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
16360 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
16370 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
16380 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
16390 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
163a0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
163b0 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
163c0 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rg2 = sqlite3Get
163d0 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
163e0 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
163f0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
16400 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
16410 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
16420 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
16430 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
16440 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
16450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16460 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
16470 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
16480 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16490 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
164a0 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
164b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
164c0 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
164d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
164e0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
164f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
16500 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
16510 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
16520 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
16530 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
16540 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
16550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
16560 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
16570 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
16580 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
16590 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73   7)==0 .    && s
165a0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
165b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
165c0 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d  ite_stat", 11)!=
165d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
165e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
165f0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
16600 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
16610 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
16620 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16630 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
16640 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16650 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
16660 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
16670 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
16680 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
16690 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
166a0 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
166b0 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
166c0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
166d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
166e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
166f0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
16700 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
16710 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
16720 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
16730 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
16740 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
16750 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
16760 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
16770 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16780 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
16790 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
167a0 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
167b0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
167c0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
167d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
167e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
167f0 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
16800 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
16810 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
16820 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
16830 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16840 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
16850 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
16860 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
16870 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
16880 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
16890 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
168a0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
168b0 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
168c0 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  "tbl", pTab->zNa
168d0 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
168e0 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50  e3FkDropTable(pP
168f0 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61  arse, pName, pTa
16900 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
16910 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
16920 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
16930 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20   iDb, isView);. 
16940 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61   }..exit_drop_ta
16950 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
16960 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
16970 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
16980 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16990 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
169a0 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
169b0 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
169c0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
169d0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
169e0 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
169f0 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
16a00 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
16a10 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
16a20 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
16a30 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
16a40 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
16a50 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
16a60 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
16a70 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
16a80 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
16a90 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
16aa0 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20  erred to (a.k.a 
16ab0 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62  the "parent" tab
16ac0 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20  le).  pToCol is 
16ad0 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62  a list.** of tab
16ae0 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  les in the paren
16af0 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c  t pTo table.  fl
16b00 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
16b10 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
16b20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
16b30 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
16b40 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
16b50 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
16b60 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
16b70 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
16b80 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
16b90 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
16ba0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
16bb0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
16bc0 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
16bd0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
16be0 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
16bf0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
16c00 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
16c10 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
16c20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
16c30 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
16c40 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
16c50 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
16c60 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
16c70 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
16c80 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
16c90 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
16ca0 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
16cb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16cc0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16cd0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
16ce0 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
16cf0 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
16d00 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
16d10 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
16d20 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
16d30 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
16d40 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
16d50 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
16d60 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
16d70 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
16d80 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
16d90 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
16da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
16db0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
16dc0 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
16dd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16de0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
16df0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16e00 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
16e10 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
16e20 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54  ;.  FKey *pNextT
16e30 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  o;.  Table *p = 
16e40 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
16e50 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
16e60 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
16e70 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
16e80 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
16e90 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
16ea0 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
16eb0 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
16ec0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
16ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
16ee0 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
16ef0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
16f00 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
16f10 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
16f20 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
16f30 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
16f40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16f50 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
16f60 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
16f70 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
16f80 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
16f90 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
16fa0 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
16fb0 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
16fc0 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
16fd0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
16fe0 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
16ff0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
17000 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
17010 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
17020 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
17030 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17040 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
17050 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
17060 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
17070 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
17080 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
17090 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
170a0 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
170b0 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
170c0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
170d0 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
170e0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
170f0 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
17100 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
17110 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
17120 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
17130 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
17140 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
17150 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
17160 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
17170 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
17180 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17190 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
171a0 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
171b0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
171c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
171d0 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
171e0 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
171f0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
17200 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
17210 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
17220 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
17230 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
17240 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
17250 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
17260 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69  ey->zTo = z;.  i
17270 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
17280 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
17290 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
172a0 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
172b0 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d  z, pTo);.  }.  m
172c0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
172d0 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
172e0 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
172f0 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
17300 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
17310 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
17320 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
17330 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
17340 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
17350 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
17360 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
17370 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
17380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
17390 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
173a0 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
173b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
173c0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
173d0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
173e0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
173f0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
17400 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
17410 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
17420 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
17430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17440 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
17450 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
17460 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17470 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
17480 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
17490 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
174a0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
174b0 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
174c0 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
174d0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
174e0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
174f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17500 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
17510 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CT ){.        sq
17520 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
17530 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70  Remap(pParse, &p
17540 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70  FKey->aCol[i], p
17550 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
17560 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
17570 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
17580 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
17590 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
175a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
175b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
175c0 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
175d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
175e0 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
175f0 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49  = z;.      if( I
17600 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
17610 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17620 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
17630 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54  ap(pParse, z, pT
17640 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
17650 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17660 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
17670 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
17680 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
17690 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
176a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
176b0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
176c0 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
176d0 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
176e0 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
176f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
17700 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
17710 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
17720 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
17730 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
17740 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
17750 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
17760 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17770 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
17780 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
17790 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
177a0 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
177b0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
177c0 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
177d0 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
177e0 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46  >zTo, (void *)pF
177f0 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
17800 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
17810 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
17820 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f  ault(db);.    go
17830 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
17840 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
17850 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
17860 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
17870 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
17880 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
17890 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
178a0 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
178b0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
178c0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
178d0 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
178e0 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
178f0 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
17900 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
17910 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
17920 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17930 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
17940 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
17950 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
17960 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
17970 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
17980 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
17990 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
179a0 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
179b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
179c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
179d0 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
179e0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
179f0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
17a00 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
17a10 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
17a20 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
17a30 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
17a40 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
17a50 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
17a60 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
17a70 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
17a80 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
17a90 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
17aa0 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
17ab0 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
17ac0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
17ad0 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
17ae0 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
17af0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
17b00 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
17b10 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
17b20 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
17b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
17b40 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
17b50 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
17b60 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
17b70 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
17b80 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
17b90 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
17ba0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
17bb0 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
17bc0 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
17bd0 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
17be0 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
17bf0 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
17c00 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
17c10 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
17c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
17c30 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
17c40 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
17c50 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
17c60 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
17c70 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
17c80 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
17c90 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
17ca0 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
17cb0 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
17cc0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
17cd0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
17ce0 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
17cf0 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
17d00 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
17d10 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
17d20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
17d30 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
17d40 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
17d50 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
17d60 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
17d70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
17d80 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
17d90 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
17da0 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
17db0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
17dc0 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
17dd0 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
17de0 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
17df0 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
17e00 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
17e10 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
17e20 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
17e30 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
17e40 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
17e50 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
17e60 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
17e70 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
17e80 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
17e90 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
17ea0 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
17eb0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
17ec0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
17ed0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
17ee0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
17ef0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
17f00 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
17f10 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
17f20 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
17f30 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
17f40 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
17f50 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
17f80 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
17f90 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
17fa0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
17fd0 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
17fe0 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18000 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
18010 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
18020 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
18030 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
18040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18050 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
18060 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
18070 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
18080 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
18090 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
180a0 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
180b0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
180d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
180e0 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
180f0 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
18100 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18120 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
18130 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
18140 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
18150 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
18160 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
18170 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
18180 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18190 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
181a0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
181b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
181c0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
181d0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
181e0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
181f0 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
18200 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18210 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
18220 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
18230 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
18240 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
18250 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
18260 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
18270 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20  .zDbSName ) ){. 
18280 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
18290 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
182a0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
182b0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
182c0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
182d0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
182e0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
182f0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
18300 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
18310 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
18320 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18330 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
18340 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
18350 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
18360 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
18370 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
18380 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
18390 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
183a0 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
183b0 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
183c0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
183d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
183e0 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
183f0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
18400 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a  e->nErr );..  /*
18410 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
18420 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
18430 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
18440 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
18450 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
18460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18470 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
18480 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
18490 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
184a0 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
184b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
184c0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
184d0 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
184e0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
184f0 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
18500 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
18510 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
18520 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
18530 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
18540 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
18550 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
18560 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
18570 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
18580 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
18590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
185a0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
185b0 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
185c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
185d0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
185e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
185f0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75  se);.  sqlite3Mu
18600 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29  ltiWrite(pParse)
18610 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
18620 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
18630 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
18640 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
18650 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
18660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18670 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
18680 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
18690 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
186a0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
186b0 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
186c0 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
186d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
186e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
186f0 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
18700 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18710 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
18720 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
18730 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
18740 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
18750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18760 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
18770 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
18780 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18790 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
187a0 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187c0 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
187d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
187e0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
187f0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
18800 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
18810 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
18820 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
18830 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
18840 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
18850 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
18860 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
18870 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55  ge(v);.  if( IsU
18880 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
18890 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  x) ){.    int j2
188a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f   = sqlite3VdbeGo
188b0 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64  to(v, 1);.    ad
188c0 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
188d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
188e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
188f0 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
18900 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20  v, OE_Abort);.  
18910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18920 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72  Op4Int(v, OP_Sor
18930 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72  terCompare, iSor
18940 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f  ter, j2, regReco
18950 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
18970 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  dex->nKeyCol); V
18980 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18990 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
189a0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
189b0 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49  se, OE_Abort, pI
189c0 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
189d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
189e0 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , j2);.  }else{.
189f0 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
18a00 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
18a10 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
18a20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18a30 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
18a40 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
18a50 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 69 66  ord, iIdx);.  if
18a60 28 20 21 70 49 6e 64 65 78 2d 3e 62 41 73 63 4b  ( !pIndex->bAscK
18a70 65 79 42 75 67 20 29 7b 0a 20 20 20 20 2f 2a 20  eyBug ){.    /* 
18a80 54 68 69 73 20 4f 50 5f 53 65 65 6b 45 6e 64 20  This OP_SeekEnd 
18a90 6f 70 63 6f 64 65 20 6d 61 6b 65 73 20 69 6e 64  opcode makes ind
18aa0 65 78 20 69 6e 73 65 72 74 20 66 6f 72 20 61 20  ex insert for a 
18ab0 52 45 49 4e 44 45 58 20 67 6f 20 6d 75 63 68 0a  REINDEX go much.
18ac0 20 20 20 20 2a 2a 20 66 61 73 74 65 72 20 62 79      ** faster by
18ad0 20 61 76 6f 69 64 69 6e 67 20 75 6e 6e 65 63 65   avoiding unnece
18ae0 73 73 61 72 79 20 73 65 65 6b 73 2e 20 20 42 75  ssary seeks.  Bu
18af0 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  t the optimizati
18b00 6f 6e 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 6e  on does.    ** n
18b10 6f 74 20 77 6f 72 6b 20 66 6f 72 20 55 4e 49 51  ot work for UNIQ
18b20 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  UE constraint in
18b30 64 65 78 65 73 20 6f 6e 20 57 49 54 48 4f 55 54  dexes on WITHOUT
18b40 20 52 4f 57 49 44 20 74 61 62 6c 65 73 0a 20 20   ROWID tables.  
18b50 20 20 2a 2a 20 77 69 74 68 20 44 45 53 43 20 70    ** with DESC p
18b60 72 69 6d 61 72 79 20 6b 65 79 73 2c 20 73 69 6e  rimary keys, sin
18b70 63 65 20 74 68 6f 73 65 20 69 6e 64 65 78 65 73  ce those indexes
18b80 20 68 61 76 65 20 74 68 65 72 65 20 6b 65 79 73   have there keys
18b90 20 69 6e 0a 20 20 20 20 2a 2a 20 61 20 64 69 66   in.    ** a dif
18ba0 66 65 72 65 6e 74 20 6f 72 64 65 72 20 66 72 6f  ferent order fro
18bb0 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  m the main table
18bc0 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63  ..    ** See tic
18bd0 6b 65 74 3a 20 68 74 74 70 73 3a 2f 2f 77 77 77  ket: https://www
18be0 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
18bf0 69 6e 66 6f 2f 62 62 61 37 62 36 39 66 39 38 34  info/bba7b69f984
18c00 39 62 35 62 66 0a 20 20 20 20 2a 2f 0a 20 20 20  9b5bf.    */.   
18c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18c20 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64  p1(v, OP_SeekEnd
18c30 2c 20 69 49 64 78 29 3b 0a 20 20 7d 0a 20 20 73  , iIdx);.  }.  s
18c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18c50 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
18c60 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72  , iIdx, regRecor
18c70 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
18c80 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
18c90 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
18ca0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
18cb0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18cc0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
18cd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ce0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
18cf0 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61  Next, iSorter, a
18d00 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72  ddr2); VdbeCover
18d10 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
18d20 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18d30 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69   addr1);..  sqli
18d40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18d50 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29   OP_Close, iTab)
18d60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18d70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
18d80 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  e, iIdx);.  sqli
18d90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18da0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74   OP_Close, iSort
18db0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  er);.}../*.** Al
18dc0 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63  locate heap spac
18dd0 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64  e to hold an Ind
18de0 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ex object with n
18df0 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  Col columns..**.
18e00 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
18e10 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
18e20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78  to provide an ex
18e30 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73  tra nExtra bytes
18e40 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  .** of 8-byte al
18e50 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65  igned space afte
18e60 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
18e70 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a  ct and return a.
18e80 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
18e90 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69  is extra space i
18ea0 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49  n *ppExtra..*/.I
18eb0 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c  ndex *sqlite3All
18ec0 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
18ed0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
18ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
18ef0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18f00 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20  */.  i16 nCol,  
18f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
18f20 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  al number of col
18f30 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
18f40 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  x */.  int nExtr
18f50 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  a,          /* N
18f60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
18f70 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f  f extra space to
18f80 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72   alloc */.  char
18f90 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20   **ppExtra      
18fa0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
18fb0 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65  he "extra" space
18fc0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
18fd0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
18fe0 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   Allocated index
18ff0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
19000 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
19010 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
19020 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62  ace for Index ob
19030 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f  ject + arrays */
19040 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ..  nByte = ROUN
19050 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
19060 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
19070 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
19080 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ure  */.        
19090 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
190a0 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20  char*)*nCol) +  
190b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
190c0 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20  azColl     */.  
190d0 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
190e0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
190f0 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20  Col+1) +     /* 
19100 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73  Index.aiRowLogEs
19110 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t   */.         
19120 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
19130 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  16)*nCol +      
19140 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
19150 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
19170 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20  zeof(u8)*nCol); 
19180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19190 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
191a0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
191b0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
191c0 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29   nByte + nExtra)
191d0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
191e0 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20   char *pExtra = 
191f0 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44  ((char*)p)+ROUND
19200 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
19210 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20  ;.    p->azColl 
19220 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
19230 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b  pExtra; pExtra +
19240 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
19250 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20  char*)*nCol);.  
19260 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74    p->aiRowLogEst
19270 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74   = (LogEst*)pExt
19280 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69  ra; pExtra += si
19290 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
192a0 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69  ol+1);.    p->ai
192b0 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70  Column = (i16*)p
192c0 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78  Extra;       pEx
192d0 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
192e0 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  6)*nCol;.    p->
192f0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
19300 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d  *)pExtra;.    p-
19310 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b  >nColumn = nCol;
19320 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20  .    p->nKeyCol 
19330 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  = nCol - 1;.    
19340 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61  *ppExtra = ((cha
19350 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20  r*)p) + nByte;. 
19360 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
19370 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
19380 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
19390 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e  n SQL table.  pN
193a0 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74  ame1.pName2 is t
193b0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
193c0 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62  ndex .** and pTb
193d0 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d  lList is the nam
193e0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
193f0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
19400 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c  exed.  Both will
19410 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72   .** be NULL for
19420 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
19430 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
19440 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61  is created to sa
19450 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55  tisfy a.** UNIQU
19460 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49  E constraint.  I
19470 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e  f pTable and pIn
19480 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73  dex are NULL, us
19490 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
194a0 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  ble.** as the ta
194b0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
194c0 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  d.  pParse->pNew
194d0 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65  Table is a table
194e0 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72   that is.** curr
194f0 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
19500 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45  tructed by a CRE
19510 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
19520 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ent..**.** pList
19530 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f   is a list of co
19540 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
19550 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c  xed.  pList will
19560 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73   be NULL if this
19570 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79  .** is a primary
19580 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63   key or unique-c
19590 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
195a0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c   most recent col
195b0 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  umn added.** to 
195c0 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
195d0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
195e0 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69  uction.  .*/.voi
195f0 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  d sqlite3CreateI
19600 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
19610 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
19620 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
19630 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
19640 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
19650 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
19660 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
19670 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
19680 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
19690 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
196a0 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
196b0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
196c0 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
196d0 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
196e0 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
196f0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
19700 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
19710 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
19720 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
19730 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
19740 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
19750 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
19760 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
19770 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
19780 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
19790 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
197a0 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
197b0 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
197c0 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
197d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57   */.  Expr *pPIW
197e0 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52  here,    /* WHER
197f0 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72  E clause for par
19800 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a  tial indices */.
19810 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
19820 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
19830 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
19840 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
19850 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
19860 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d  tExist,    /* Om
19870 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
19880 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
19890 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65   */.  u8 idxType
198a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
198b0 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b  index type */.){
198c0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
198d0 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
198e0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
198f0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
19900 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
19910 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
19920 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
19930 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
19940 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
19950 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
19960 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
19970 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
19980 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
19990 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44  .  int i, j;.  D
199a0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
199b0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
199c0 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
199d0 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
199e0 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
199f0 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
19a00 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
19a10 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
19a20 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
19a30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
19a40 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
19a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19a60 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
19a70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
19a80 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
19a90 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
19aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
19ab0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
19ac0 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
19ad0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
19ae0 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
19af0 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
19b00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
19b10 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
19b20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
19b30 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
19b40 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
19b50 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
19b60 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
19b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b80 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
19b90 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61  cated for zExtra
19ba0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  [] */.  int nExt
19bb0 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  raCol;          
19bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19bd0 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75  er of extra colu
19be0 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  mns needed */.  
19bf0 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30  char *zExtra = 0
19c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19c10 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
19c20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20  after the Index 
19c30 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65  object */.  Inde
19c40 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20  x *pPk = 0;     
19c50 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   /* PRIMARY KEY 
19c60 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55  index for WITHOU
19c70 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
19c80 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
19c90 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
19ca0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
19cb0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19cc0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
19cd0 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f   if( IN_DECLARE_
19ce0 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65 21  VTAB && idxType!
19cf0 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
19d00 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20  PRIMARYKEY ){.  
19d10 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19d20 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
19d30 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
19d40 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
19d50 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
19d60 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19d70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
19d80 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
19d90 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
19da0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
19db0 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
19dc0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
19dd0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
19de0 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
19df0 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
19e00 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
19e10 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
19e20 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
19e30 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
19e40 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
19e50 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
19e60 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
19e70 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
19e80 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
19e90 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
19ea0 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
19eb0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
19ec0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
19ed0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
19ee0 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
19ef0 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
19f00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19f10 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
19f20 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a  Name && pName->z
19f30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
19f40 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
19f50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
19f60 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
19f70 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
19f80 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  if the table.   
19f90 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
19fa0 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
19fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
19fc0 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
19fd0 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
19fe0 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
19ff0 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
1a000 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
1a010 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1a020 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
1a030 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
1a040 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
1a050 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
1a060 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
1a070 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
1a080 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
1a090 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
1a0a0 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
1a0b0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
1a0c0 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e      sqlite3FixIn
1a0d0 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
1a0e0 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
1a0f0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
1a100 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
1a110 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
1a120 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  e) ){.      /* B
1a130 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
1a140 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
1a150 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
1a160 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
1a170 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
1a180 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
1a190 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
1a1a0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
1a1b0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
1a1c0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1a1d0 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
1a1e0 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  , &pTblName->a[0
1a1f0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1a200 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a210 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29  ==0 || pTab==0 )
1a220 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
1a230 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1a240 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a250 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62  if( iDb==1 && db
1a260 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1a270 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
1a280 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
1a290 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a2a0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  e, .           "
1a2b0 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20  cannot create a 
1a2c0 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f  TEMP index on no
1a2d0 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25  n-TEMP table \"%
1a2e0 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
1a2f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
1a300 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a310 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a320 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
1a330 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b  owid(pTab) ) pPk
1a340 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
1a350 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
1a360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1a370 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
1a380 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
1a390 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  tart==0 );.    p
1a3a0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
1a3b0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
1a3c0 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
1a3d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a3e0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
1a3f0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1a400 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1a410 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
1a420 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
1a430 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
1a440 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a450 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1a460 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
1a470 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
1a480 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
1a490 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
1a4a0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
1a4b0 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 62 6c  0.       && pTbl
1a4c0 4e 61 6d 65 21 3d 30 0a 23 69 66 20 53 51 4c 49  Name!=0.#if SQLI
1a4d0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
1a4e0 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26  CATION.       &&
1a4f0 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1a500 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d  Table(pTab->zNam
1a510 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69 66  e)==0.#endif.#if
1a520 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57  def SQLITE_ALLOW
1a530 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f 49  _SQLITE_MASTER_I
1a540 4e 44 45 58 0a 20 20 20 20 20 20 20 26 26 20 73  NDEX.       && s
1a550 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 26 70  qlite3StrICmp(&p
1a560 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 6d  Tab->zName[7],"m
1a570 61 73 74 65 72 22 29 21 3d 30 0a 23 65 6e 64 69  aster")!=0.#endi
1a580 66 0a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  f. ){.    sqlite
1a590 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a5a0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
1a5b0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
1a5c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
1a5d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a5e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
1a5f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a600 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
1a610 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
1a620 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a630 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
1a640 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
1a650 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
1a660 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a670 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
1a680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a690 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1a6a0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1a6b0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
1a6c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a6d0 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
1a6e0 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
1a6f0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
1a700 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1a710 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
1a720 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
1a730 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
1a740 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
1a750 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
1a760 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
1a770 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
1a780 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
1a790 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
1a7a0 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
1a7b0 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
1a7c0 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
1a7d0 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
1a7e0 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
1a7f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
1a800 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
1a810 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
1a820 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
1a830 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
1a840 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
1a850 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
1a860 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
1a870 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1a880 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
1a890 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
1a8a0 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
1a8b0 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
1a8c0 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
1a8d0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
1a8e0 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
1a8f0 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
1a900 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
1a910 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
1a920 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
1a930 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
1a940 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
1a950 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
1a960 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1a970 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
1a980 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
1a990 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
1a9a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a9b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1a9c0 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
1a9d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1a9e0 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
1a9f0 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
1aa00 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
1aa10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1aa20 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1aa30 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
1aa40 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ECT ){.      if(
1aa50 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
1aa60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1aa70 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1aa80 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
1aa90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1aaa0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1aab0 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
1aac0 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
1aad0 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
1aae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
1aaf0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ab00 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dex;.        }. 
1ab10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ab20 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1ab30 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
1ab40 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29  ->zDbSName)!=0 )
1ab50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  {.        if( !i
1ab60 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
1ab70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1ab80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ab90 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
1aba0 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
1abb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1abc0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1abd0 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
1abe0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  y );.          s
1abf0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1ac00 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1ac10 44 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Db);.        }. 
1ac20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1ac30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1ac40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ac50 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
1ac60 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
1ac70 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
1ac80 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
1ac90 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
1aca0 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
1acb0 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
1acc0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1acd0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
1ace0 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
1acf0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
1ad00 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
1ad10 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1ad20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ad30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ad40 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  Automatic index 
1ad50 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20  names generated 
1ad60 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69  from within sqli
1ad70 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
1ad80 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68  ().    ** must h
1ad90 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61  ave names that a
1ada0 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  re distinct from
1adb0 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69   normal automati
1adc0 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20  c index names.. 
1add0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
1ade0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ing statement co
1adf0 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f  nverts "sqlite3_
1ae00 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  autoindex..." in
1ae10 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74  to.    ** "sqlit
1ae20 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_butoindex..."
1ae30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1ae40 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74  e the names dist
1ae50 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  inct..    ** The
1ae60 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22   "vtab_err.test"
1ae70 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74   test demonstrat
1ae80 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74  es the need of t
1ae90 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  his statement. *
1aea0 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 53 50 45  /.    if( IN_SPE
1aeb0 43 49 41 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61  CIAL_PARSE ) zNa
1aec0 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  me[7]++;.  }..  
1aed0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
1aee0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
1aef0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
1af00 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1af10 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1af20 41 54 49 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f  ATION.  if( !IN_
1af30 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1af40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1af50 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53  *zDb = pDb->zDbS
1af60 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
1af70 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1af80 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
1af90 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
1afa0 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
1afb0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1afc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1afd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
1afe0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
1aff0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
1b000 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1b010 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
1b020 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
1b030 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
1b040 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1b050 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
1b060 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
1b070 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1b080 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1b0a0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
1b0b0 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
1b0c0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1b0d0 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
1b0e0 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
1b0f0 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
1b100 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
1b110 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
1b120 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
1b130 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
1b140 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
1b150 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
1b160 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
1b170 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72   ){.    Token pr
1b180 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d  evCol;.    Colum
1b190 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d  n *pCol = &pTab-
1b1a0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
1b1b0 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  -1];.    pCol->c
1b1c0 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
1b1d0 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 73  AG_UNIQUE;.    s
1b1e0 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
1b1f0 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e  &prevCol, pCol->
1b200 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
1b210 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1b220 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1b230 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1b240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c     sqlite3ExprAl
1b250 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26  loc(db, TK_ID, &
1b260 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20  prevCol, 0));.  
1b270 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1b280 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b290 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
1b2a0 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
1b2b0 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  r==1 );.    sqli
1b2c0 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
1b2d0 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73  rtOrder(pList, s
1b2e0 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c  ortOrder);.  }el
1b2f0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1b300 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
1b310 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  th(pParse, pList
1b320 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 20 20  , "index");.    
1b330 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1b340 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1b350 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
1b360 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1b370 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
1b380 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
1b390 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
1b3a0 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
1b3b0 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
1b3c0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
1b3d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1b3e0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1b3f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1b400 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
1b410 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1b420 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
1b430 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  0 );.    if( pEx
1b440 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
1b450 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  TE ){.      nExt
1b460 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
1b470 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
1b480 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
1b490 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
1b4a0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
1b4b0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
1b4c0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
1b4d0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1b4e0 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
1b4f0 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
1b500 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
1b510 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1b520 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
1b530 6f 6c 20 3c 3d 20 33 32 37 36 37 20 2f 2a 20 46  ol <= 32767 /* F
1b540 69 74 73 20 69 6e 20 69 31 36 20 2a 2f 20 29 3b  its in i16 */ );
1b550 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1b560 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
1b570 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74  Object(db, pList
1b580 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61  ->nExpr + nExtra
1b590 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65             nName
1b5c0 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26   + nExtra + 1, &
1b5d0 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64  zExtra);.  if( d
1b5e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b5f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1b600 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b610 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
1b620 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1b630 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  T(pIndex->aiRowL
1b640 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  ogEst) );.  asse
1b650 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1b660 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
1b670 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
1b680 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45  ndex->zName = zE
1b690 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
1b6a0 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d  = nName + 1;.  m
1b6b0 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
1b6c0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
1b6d0 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
1b6e0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
1b6f0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1b700 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
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 6f 6e 45 72 72 6f 72 21  tNull = onError!
1b730 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64  =OE_None;.  pInd
1b740 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  ex->idxType = id
1b750 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d  xType;.  pIndex-
1b760 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
1b770 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
1b780 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  .  pIndex->nKeyC
1b790 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
1b7a0 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72  r;.  if( pPIWher
1b7b0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1b7c0 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
1b7d0 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
1b7e0 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70  b, NC_PartIdx, p
1b7f0 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  PIWhere, 0);.   
1b800 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64   pIndex->pPartId
1b810 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72  xWhere = pPIWher
1b820 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20  e;.    pPIWhere 
1b830 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
1b840 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1b850 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1b860 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  b, 0) );..  /* C
1b870 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
1b880 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
1b890 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
1b8a0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
1b8b0 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
1b8c0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1b8d0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
1b8e0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
1b8f0 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
1b900 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1b910 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
1b920 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
1b930 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
1b940 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c  /* Analyze the l
1b950 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
1b960 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
1b970 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
1b980 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70  dex and.  ** rep
1b990 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20  ort any errors. 
1b9a0 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   In the common c
1b9b0 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78  ase where the ex
1b9c0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63  pression is exac
1b9d0 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65  tly.  ** a table
1b9e0 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74   column, store t
1b9f0 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69  hat column in ai
1ba00 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67  Column[].  For g
1ba10 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f  eneral expressio
1ba20 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74  ns,.  ** populat
1ba30 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  e pIndex->aColEx
1ba40 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f  pr and store XN_
1ba50 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43  EXPR (-2) in aiC
1ba60 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20  olumn[]..  **.  
1ba70 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1ba80 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20   warning if two 
1ba90 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
1baa0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  of the index are
1bab0 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
1bac0 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77   TODO: Issue a w
1bad0 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61  arning if the ta
1bae0 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ble primary key 
1baf0 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
1bb00 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  of the.  ** inde
1bb10 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c  x key..  */.  pL
1bb20 69 73 74 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d  istItem = pList-
1bb30 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  >a;.  if( IN_REN
1bb40 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1bb50 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1bb60 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  pr = pList;.    
1bb70 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pList = 0;.  }. 
1bb80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
1bb90 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  ex->nKeyCol; i++
1bba0 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
1bbb0 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
1bbc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bbd0 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69     /* The i-th i
1bbe0 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20  ndex expression 
1bbf0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  */.    int reque
1bc00 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20  stedSortOrder;  
1bc10 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20        /* ASC or 
1bc20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68  DESC on the i-th
1bc30 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1bc40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1bc50 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1bc60 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
1bc70 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1bc80 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69  .    sqlite3Stri
1bc90 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d  ngToId(pListItem
1bca0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
1bcb0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1bcc0 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1bcd0 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78  , pTab, NC_IdxEx
1bce0 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  pr, pListItem->p
1bcf0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Expr, 0);.    if
1bd00 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1bd10 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1bd20 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45  e_index;.    pCE
1bd30 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1bd40 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
1bd50 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
1bd60 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
1bd70 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
1bd80 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1bd90 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1bda0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
1bdb0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1bdc0 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f  arse, "expressio
1bdd0 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  ns prohibited in
1bde0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1bdf0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74     "UNIQUE const
1be20 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
1be30 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1be40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1be50 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  }.      if( pInd
1be60 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20  ex->aColExpr==0 
1be70 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1be80 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c  x->aColExpr = pL
1be90 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  ist;.        pLi
1bea0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  st = 0;.      }.
1beb0 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50        j = XN_EXP
1bec0 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  R;.      pIndex-
1bed0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1bee0 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1bef0 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1bf00 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
1bf10 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78  {.      j = pCEx
1bf20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
1bf30 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78     assert( j<=0x
1bf40 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66  7fff );.      if
1bf50 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( j<0 ){.       
1bf60 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79   j = pTab->iPKey
1bf70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1bf80 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
1bf90 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
1bfa0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1bfb0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1bfc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1bfd0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1bfe0 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d   = (i16)j;.    }
1bff0 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  .    zColl = 0;.
1c000 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
1c010 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
1c020 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1c030 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20    int nColl;.   
1c040 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74     zColl = pList
1c050 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a  Item->pExpr->u.z
1c060 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f  Token;.      nCo
1c070 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
1c080 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
1c090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1c0a0 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
1c0b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
1c0c0 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
1c0d0 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
1c0e0 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
1c0f0 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
1c100 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
1c110 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
1c120 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20  e if( j>=0 ){.  
1c130 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
1c140 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
1c150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1c160 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20  zColl ) zColl = 
1c170 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1c180 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
1c190 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c  nit.busy && !sql
1c1a0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
1c1b0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
1c1c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1c1d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1c1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1c1f0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1c200 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
1c210 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
1c220 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
1c230 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
1c240 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
1c250 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1c260 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53  = (u8)requestedS
1c270 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
1c280 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74   /* Append the t
1c290 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20  able key to the 
1c2a0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1c2b0 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52  .  For WITHOUT R
1c2c0 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73  OWID.  ** tables
1c2d0 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74   (when pPk!=0) t
1c2e0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1c2f0 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59  declared PRIMARY
1c300 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20   KEY.  For.  ** 
1c310 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77  normal tables (w
1c320 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73  hen pPk==0) this
1c330 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77   will be the row
1c340 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  id..  */.  if( p
1c350 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  Pk ){.    for(j=
1c360 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
1c370 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
1c380 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  nt x = pPk->aiCo
1c390 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  lumn[j];.      a
1c3a0 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
1c3b0 20 20 20 20 20 69 66 28 20 69 73 44 75 70 43 6f       if( isDupCo
1c3c0 6c 75 6d 6e 28 70 49 6e 64 65 78 2c 20 70 49 6e  lumn(pIndex, pIn
1c3d0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  dex->nKeyCol, pP
1c3e0 6b 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  k, j) ){.       
1c3f0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1c400 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1c410 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1c420 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49  se( hasColumn(pI
1c430 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 70  ndex->aiColumn,p
1c440 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 78  Index->nKeyCol,x
1c450 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) );.        pIn
1c460 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1c470 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49   = x;.        pI
1c480 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1c490 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  = pPk->azColl[j]
1c4a0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1c4b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1c4c0 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65  = pPk->aSortOrde
1c4d0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b  r[j];.        i+
1c4e0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1c4f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
1c500 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1c510 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c520 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1c530 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  [i] = XN_ROWID;.
1c540 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1c550 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[i] = sqlite3S
1c560 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20  trBINARY;.  }.  
1c570 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1c580 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20  wEst(pIndex);.  
1c590 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
1c5a0 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d  Table==0 ) estim
1c5b0 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
1c5c0 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ndex);..  /* If 
1c5d0 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61  this index conta
1c5e0 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ins every column
1c5f0 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74   of its table, t
1c600 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74  hen mark.  ** it
1c610 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
1c620 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
1c630 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1c640 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d   .      || pTab-
1c650 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69  >iPKey<0 || sqli
1c660 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1c670 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69  (pIndex, pTab->i
1c680 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65  PKey)>=0 );.  re
1c690 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
1c6a0 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78 29  tIndexed(pIndex)
1c6b0 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  ;.  if( pTblName
1c6c0 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e  !=0 && pIndex->n
1c6d0 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43  Column>=pTab->nC
1c6e0 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ol ){.    pIndex
1c6f0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
1c700 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1c710 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1c720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  ){.      if( j==
1c730 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
1c740 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1c750 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  ( sqlite3ColumnO
1c760 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29  fIndex(pIndex,j)
1c770 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
1c780 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73        pIndex->is
1c790 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20  Covering = 0;.  
1c7a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c7b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
1c7c0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
1c7d0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
1c7e0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
1c7f0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
1c800 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
1c810 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
1c820 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
1c830 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1c840 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
1c850 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
1c860 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
1c870 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1c880 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
1c890 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
1c8a0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
1c8b0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
1c8c0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1c8d0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1c8e0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1c8f0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
1c900 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
1c910 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
1c920 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
1c930 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
1c940 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
1c950 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
1c960 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
1c970 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
1c980 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
1c990 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
1c9a0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
1c9b0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1c9c0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
1c9d0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
1c9e0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
1c9f0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
1ca00 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
1ca10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
1ca20 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1ca30 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1ca40 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
1ca50 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
1ca60 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
1ca70 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
1ca80 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
1ca90 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
1caa0 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
1cab0 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
1cac0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
1cad0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
1cae0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1caf0 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
1cb00 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
1cb10 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
1cb20 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
1cb30 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
1cb40 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
1cb50 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
1cb60 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
1cb70 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
1cb80 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
1cb90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
1cba0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1cbb0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1cbc0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1cbd0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1cbe0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1cbf0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1cc00 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a  eIndex(pIdx) );.
1cc10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1cc20 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  dx->idxType!=SQL
1cc30 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1cc40 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EF );.      asse
1cc50 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1cc60 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20  x(pIndex) );..  
1cc70 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
1cc80 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
1cc90 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
1cca0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
1ccb0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
1ccc0 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
1ccd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
1cce0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1ccf0 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
1cd00 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1cd10 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b  iColumn[k]>=0 );
1cd20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1cd30 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
1cd40 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1cd50 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
1cd60 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
1cd70 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1cd80 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
1cd90 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1cda0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1cdb0 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
1cdc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1cdd0 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
1cde0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
1cdf0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1ce00 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
1ce10 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
1ce20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1ce30 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
1ce40 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
1ce50 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
1ce60 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1ce70 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
1ce80 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
1ce90 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1cea0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
1ceb0 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
1cec0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1ced0 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
1cee0 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
1cef0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
1cf00 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
1cf10 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
1cf20 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
1cf30 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
1cf40 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
1cf50 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1cf60 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1cf70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
1cf80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1cf90 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
1cfa0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20  cified behavior 
1cfb0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
1cfc0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1cfd0 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
1cfe0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1cff0 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
1d000 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1d010 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
1d020 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d030 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1d050 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
1d060 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
1d070 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
1d080 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d090 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1d0a0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1d0b0 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
1d0c0 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
1d0d0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
1d0e0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
1d0f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d100 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51   if( idxType==SQ
1d110 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
1d120 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e  MARYKEY ) pIdx->
1d130 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
1d140 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  e;.        if( I
1d150 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1d160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e  ){.          pIn
1d170 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  dex->pNext = pPa
1d180 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 3b 0a  rse->pNewIndex;.
1d190 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1d1a0 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20 70 49  ->pNewIndex = pI
1d1b0 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
1d1c0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
1d1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
1d1e0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1d1f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1d200 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
1d210 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
1d220 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b   ){..    /* Link
1d230 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
1d240 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
1d250 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
1d260 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 69 6e   other.    ** in
1d270 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1d280 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
1d290 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1d2a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1d2b0 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   );.    if( db->
1d2c0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1d2d0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1d2e0 20 20 20 61 73 73 65 72 74 28 20 21 49 4e 5f 53     assert( !IN_S
1d2f0 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 3b 0a  PECIAL_PARSE );.
1d300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1d310 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1d320 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
1d330 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
1d340 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61        if( pTblNa
1d350 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me!=0 ){.       
1d360 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1d370 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1d380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1d390 6c 69 74 65 33 49 6e 64 65 78 48 61 73 44 75 70  lite3IndexHasDup
1d3a0 6c 69 63 61 74 65 52 6f 6f 74 50 61 67 65 28 70  licateRootPage(p
1d3b0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
1d3c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d3d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 76  Msg(pParse, "inv
1d3e0 61 6c 69 64 20 72 6f 6f 74 70 61 67 65 22 29 3b  alid rootpage");
1d3f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1d400 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  e->rc = SQLITE_C
1d410 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1d420 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1d430 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1d440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d450 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
1d460 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
1d470 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
1d480 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
1d490 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1d4a0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  , pIndex);.     
1d4b0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1d4c0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
1d4d0 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
1d4e0 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1d4f0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1d500 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
1d510 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1d520 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1d530 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1d540 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
1d550 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
1d560 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ange;.    }..   
1d570 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1d580 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54  he initial CREAT
1d590 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1d5a0 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42  t (or CREATE TAB
1d5b0 4c 45 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  LE if the.    **
1d5c0 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70   index is an imp
1d5d0 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61  lied index for a
1d5e0 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1d5f0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1d600 74 29 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 65  t) then.    ** e
1d610 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f  mit code to allo
1d620 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72  cate the index r
1d630 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20  ootpage on disk 
1d640 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72  and make an entr
1d650 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65  y for.    ** the
1d660 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71   index in the sq
1d670 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1d680 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
1d690 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20  he index with.  
1d6a0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42    ** content.  B
1d6b0 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  ut, do not do th
1d6c0 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d  is if we are sim
1d6d0 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20  ply reading the 
1d6e0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
1d6f0 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61    ** table to pa
1d700 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20  rse the schema, 
1d710 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  or if this index
1d720 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
1d730 4b 45 59 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  KEY index.    **
1d740 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
1d750 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  WID table..    *
1d760 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 54 62 6c  *.    ** If pTbl
1d770 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
1d780 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
1d790 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69  enerated as an i
1d7a0 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b  mplied PRIMARY K
1d7b0 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20 55 4e 49  EY.    ** or UNI
1d7c0 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43  QUE index in a C
1d7d0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1d7e0 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
1d7f0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 68  e table.    ** h
1d800 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
1d810 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
1d820 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
1d830 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
1d840 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 73 74  zation.    ** st
1d850 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
1d860 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c  d..    */.    el
1d870 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1d880 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d  pTab) || pTblNam
1d890 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 56 64  e!=0 ){.      Vd
1d8a0 62 65 20 2a 76 3b 0a 20 20 20 20 20 20 63 68 61  be *v;.      cha
1d8b0 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 20 20  r *zStmt;.      
1d8c0 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
1d8d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20  rse->nMem;..    
1d8e0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1d8f0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1d900 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
1d910 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1d920 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20 20 73 71  index;..      sq
1d930 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1d940 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1d950 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20   1, iDb);..     
1d960 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
1d970 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
1d980 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61  index using Crea
1d990 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66  teIndex. But bef
1d9a0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 69  ore.      ** doi
1d9b0 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f  ng so, code a No
1d9c0 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  op instruction a
1d9d0 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64  nd store its add
1d9e0 72 65 73 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  ress in .      *
1d9f0 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68  * Index.tnum. Th
1da00 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 69  is is required i
1da10 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e 64 65  n case this inde
1da20 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  x is actually a 
1da30 0a 20 20 20 20 20 20 2a 2a 20 50 52 49 4d 41 52  .      ** PRIMAR
1da40 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61  Y KEY and the ta
1da50 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ble is actually 
1da60 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1da70 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 20  table. In .     
1da80 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68   ** that case th
1da90 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  e convertToWitho
1daa0 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72  utRowidTable() r
1dab0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c  outine will repl
1dac0 61 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ace.      ** the
1dad0 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74   Noop with a Got
1dae0 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74  o to jump over t
1daf0 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e  he VDBE code gen
1db00 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f  erated below. */
1db10 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
1db20 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  num = sqlite3Vdb
1db30 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f  eAddOp0(v, OP_No
1db40 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
1db50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1db60 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20  OP_CreateBtree, 
1db70 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54 52 45 45  iDb, iMem, BTREE
1db80 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20 20 20 20  _BLOBKEY);..    
1db90 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
1dba0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
1dbb0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
1dbc0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
1dbd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  .      ** the zS
1dbe0 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
1dbf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1dc00 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1dc10 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28    int n = (int)(
1dc20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1dc30 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29  en.z - pName->z)
1dc40 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   + pParse->sLast
1dc50 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 20  Token.n;.       
1dc60 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d   if( pName->z[n-
1dc70 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20  1]==';' ) n--;. 
1dc80 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65         /* A name
1dc90 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
1dca0 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
1dcb0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1dcc0 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  */.        zStmt
1dcd0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1dce0 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20  f(db, "CREATE%s 
1dcf0 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20  INDEX %.*s",.   
1dd00 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72           onError
1dd10 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
1dd20 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70   " UNIQUE", n, p
1dd30 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  Name->z);.      
1dd40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1dd50 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
1dd60 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
1dd70 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1dd80 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1dd90 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a  nt */.        /*
1dda0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1ddb0 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
1ddc0 20 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20          zStmt = 
1ddd0 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
1dde0 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
1ddf0 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
1de00 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
1de10 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
1de20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1de30 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
1de40 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
1de50 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
1de60 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
1de70 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  %d,%Q);",.      
1de80 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1de90 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
1dea0 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20 20  R_NAME,.        
1deb0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1dec0 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
1ded0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1dee0 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20    iMem,.        
1def0 20 20 7a 53 74 6d 74 0a 20 20 20 20 20 20 20 20    zStmt.        
1df00 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
1df10 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1df20 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  mt);..      /* F
1df30 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
1df40 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
1df50 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
1df60 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
1df70 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e  e.      ** to in
1df80 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
1df90 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
1dfa0 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ents..      */. 
1dfb0 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d       if( pTblNam
1dfc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1dfd0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1dfe0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1dff0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
1e000 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1e010 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1e020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e030 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1e040 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
1e050 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e060 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d  MPrintf(db, "nam
1e070 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d  e='%q' AND type=
1e080 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78  'index'", pIndex
1e090 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
1e0a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e0b0 64 4f 70 32 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp2(v, OP_Expir
1e0c0 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 0, 1);.      
1e0d0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
1e0e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1e0f0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20  pIndex->tnum);. 
1e100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
1e110 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
1e120 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
1e130 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
1e140 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
1e150 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
1e160 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
1e170 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
1e180 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
1e190 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
1e1a0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
1e1b0 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
1e1c0 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74  rrect constraint
1e1d0 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63   check.  ** proc
1e1e0 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74  essing (in sqlit
1e1f0 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
1e200 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73  aintChecks()) as
1e210 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50   part of.  ** UP
1e220 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
1e230 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20  statements.  .  
1e240 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
1e250 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
1e260 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
1e270 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
1e280 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
1e290 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
1e2a0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1e2b0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
1e2c0 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
1e2d0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
1e2e0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1e2f0 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
1e300 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
1e310 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
1e320 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
1e330 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
1e340 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
1e350 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
1e360 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
1e370 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
1e380 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
1e390 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1e3a0 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1e3b0 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
1e3c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
1e3d0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
1e3e0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
1e3f0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
1e400 0a 20 20 65 6c 73 65 20 69 66 28 20 49 4e 5f 52  .  else if( IN_R
1e410 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
1e420 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1e430 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 3d 3d 30  se->pNewIndex==0
1e440 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
1e450 70 4e 65 77 49 6e 64 65 78 20 3d 20 70 49 6e 64  pNewIndex = pInd
1e460 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d  ex;.    pIndex =
1e470 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
1e480 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
1e490 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
1e4a0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
1e4b0 28 20 70 49 6e 64 65 78 20 29 20 73 71 6c 69 74  ( pIndex ) sqlit
1e4c0 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
1e4d0 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
1e4e0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1e4f0 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71   pPIWhere);.  sq
1e500 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1e510 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1e520 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1e530 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
1e540 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1e550 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
1e560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  ;.}../*.** Fill 
1e570 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45  the Index.aiRowE
1e580 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20  st[] array with 
1e590 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74  default informat
1e5a0 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f  ion - informatio
1e5b0 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20  n.** to be used 
1e5c0 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74  when we have not
1e5d0 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45   run the ANALYZE
1e5e0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
1e5f0 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73  aiRowEst[0] is s
1e600 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61  upposed to conta
1e610 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1e620 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1e630 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65   index..** Since
1e640 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c   we do not know,
1e650 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e   guess 1 million
1e660 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69  .  aiRowEst[1] i
1e670 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1e680 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
1e690 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1e6a0 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61  ble that match a
1e6b0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  ny particular va
1e6c0 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  lue of the.** fi
1e6d0 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
1e6e0 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45  e index.  aiRowE
1e6f0 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69  st[2] is an esti
1e700 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
1e710 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68  er.** of rows th
1e720 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
1e730 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74  ticular combinat
1e740 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
1e750 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66   2 columns.** of
1e760 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64   the index.  And
1e770 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d   so forth.  It m
1e780 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68  ust always be th
1e790 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a  e case that.*.**
1e7a0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1e7b0 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74  Est[N]<=aiRowEst
1e7c0 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20  [N-1].**        
1e7d0 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d     aiRowEst[N]>=
1e7e0 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72  1.**.** Apart fr
1e7f0 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65  om that, we have
1e800 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e   little to go on
1e810 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69   besides intuiti
1e820 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20  on as to.** how 
1e830 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c  aiRowEst[] shoul
1e840 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  d be initialized
1e850 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67  .  The numbers g
1e860 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a  enerated here.**
1e870 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79   are based on ty
1e880 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75  pical values fou
1e890 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64  nd in actual ind
1e8a0 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ices..*/.void sq
1e8b0 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
1e8c0 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  st(Index *pIdx){
1e8d0 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20  .  /*           
1e8e0 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c       10,  9,  8,
1e8f0 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67    7,  6 */.  Log
1e900 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33  Est aVal[] = { 3
1e910 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32  3, 32, 30, 28, 2
1e920 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61  6 };.  LogEst *a
1e930 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f   = pIdx->aiRowLo
1e940 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70  gEst;.  int nCop
1e950 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a  y = MIN(ArraySiz
1e960 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e  e(aVal), pIdx->n
1e970 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69  KeyCol);.  int i
1e980 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73 20  ;..  /* Indexes 
1e990 77 69 74 68 20 64 65 66 61 75 6c 74 20 72 6f 77  with default row
1e9a0 20 65 73 74 69 6d 61 74 65 73 20 73 68 6f 75 6c   estimates shoul
1e9b0 64 20 6e 6f 74 20 68 61 76 65 20 73 74 61 74 31  d not have stat1
1e9c0 20 64 61 74 61 20 2a 2f 0a 20 20 61 73 73 65 72   data */.  asser
1e9d0 74 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61  t( !pIdx->hasSta
1e9e0 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  t1 );..  /* Set 
1e9f0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1ea00 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20  (number of rows 
1ea10 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f  in the index) to
1ea20 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a   the estimated .
1ea30 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
1ea40 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1ea50 2c 20 6f 72 20 68 61 6c 66 20 74 68 65 20 6e 75  , or half the nu
1ea60 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1ea70 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66  the table.  ** f
1ea80 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  or a partial ind
1ea90 65 78 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f 74  ex.   But do not
1eaa0 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61 74   let the estimat
1eab0 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e  e drop below 10.
1eac0 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64   */.  a[0] = pId
1ead0 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  x->pTable->nRowL
1eae0 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 70 49 64  ogEst;.  if( pId
1eaf0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
1eb00 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30  !=0 ) a[0] -= 10
1eb10 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73  ;  assert( 10==s
1eb20 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
1eb30 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33  );.  if( a[0]<33
1eb40 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20   ) a[0] = 33;   
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1eb60 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74  ssert( 33==sqlit
1eb70 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a  e3LogEst(10) );.
1eb80 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
1eb90 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20  hat a[1] is 10, 
1eba0 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20  a[2] is 9, a[3] 
1ebb0 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c  is 8, a[4] is 7,
1ebc0 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20   a[5] is.  ** 6 
1ebd0 61 6e 64 20 65 61 63 68 20 73 75 62 73 65 71 75  and each subsequ
1ebe0 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e  ent value (if an
1ebf0 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d  y) is 5.  */.  m
1ec00 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61  emcpy(&a[1], aVa
1ec10 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28  l, nCopy*sizeof(
1ec20 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28  LogEst));.  for(
1ec30 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49  i=nCopy+1; i<=pI
1ec40 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  dx->nKeyCol; i++
1ec50 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33  ){.    a[i] = 23
1ec60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ec70 20 20 20 20 20 61 73 73 65 72 74 28 20 32 33 3d       assert( 23=
1ec80 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35  =sqlite3LogEst(5
1ec90 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ) );.  }..  asse
1eca0 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  rt( 0==sqlite3Lo
1ecb0 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28  gEst(1) );.  if(
1ecc0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1ecd0 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e  Idx) ) a[pIdx->n
1ece0 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a  KeyCol] = 0;.}..
1ecf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ed00 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
1ed10 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
1ed20 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
1ed30 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
1ed40 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
1ed50 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
1ed60 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
1ed70 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
1ed80 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
1ed90 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73  me, int ifExists
1eda0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
1edb0 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
1edc0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1edd0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
1ede0 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   iDb;..  assert(
1edf0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1ee00 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63   );   /* Never c
1ee10 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72  alled with prior
1ee20 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28   errors */.  if(
1ee30 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1ee40 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
1ee50 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1ee60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
1ee70 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
1ee80 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1ee90 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1eea0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1eeb0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1eec0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
1eed0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1eee0 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
1eef0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
1ef00 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1ef10 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
1ef20 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
1ef30 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
1ef40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ef50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1ef60 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
1ef70 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
1ef80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1ef90 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
1efa0 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
1efb0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1efc0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a  atabase);.    }.
1efd0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
1efe0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
1eff0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1f000 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
1f010 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1f020 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1f030 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73  _APPDEF ){.    s
1f040 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1f050 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
1f060 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
1f070 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
1f080 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1f090 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
1f0a0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
1f0b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1f0c0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1f0d0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1f0e0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
1f0f0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
1f100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f110 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1f120 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
1f130 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1f140 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
1f150 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
1f160 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
1f170 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1f180 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1f190 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
1f1a0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
1f1b0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
1f1c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f1d0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f1e0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
1f1f0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
1f200 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1f210 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1f220 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
1f230 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1f240 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
1f250 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
1f260 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f270 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f280 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
1f290 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
1f2a0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
1f2b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1f2c0 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1f2d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f2e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1f2f0 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
1f300 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
1f310 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
1f320 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1f330 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1f340 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1f350 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1f360 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
1f370 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1f380 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
1f390 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
1f3a0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
1f3b0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41   WHERE name=%Q A
1f3c0 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1f3d0 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
1f3e0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1f3f0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e  MASTER_NAME, pIn
1f400 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1f410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1f420 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1f430 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1f440 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1f450 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1f460 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1f470 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1f480 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1f490 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1f4a0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1f4b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f4c0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1f4d0 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1f4e0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1f4f0 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1f500 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1f510 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1f520 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1f530 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1f540 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1f550 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1f560 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1f570 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1f580 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1f590 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1f5a0 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1f5b0 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1f5c0 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1f5d0 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1f5e0 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1f5f0 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1f600 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1f610 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f620 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1f630 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1f640 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1f650 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1f660 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1f670 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1f680 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1f690 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1f6a0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1f6b0 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1f6c0 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1f6d0 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1f6e0 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1f6f0 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1f700 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1f710 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1f720 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1f730 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1f740 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1f750 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1f760 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f770 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1f780 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1f790 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1f7a0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1f7b0 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1f7c0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1f7d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1f7e0 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1f7f0 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1f800 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1f810 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1f820 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1f830 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1f840 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1f850 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1f860 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1f870 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1f880 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1f890 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1f8a0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1f8b0 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1f8c0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1f8d0 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1f8e0 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1f8f0 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1f900 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1f910 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1f920 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1f930 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1f940 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1f950 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1f960 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1f970 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1f980 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1f990 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1f9a0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c    char *z;.  sql
1f9b0 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20 2a  ite3_int64 n = *
1f9c0 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  pIdx = *pnEntry;
1f9d0 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1f9e0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))==0 ){.    sql
1f9f0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20  ite3_int64 sz = 
1fa00 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e  (n==0) ? 1 : 2*n
1fa10 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  ;.    void *pNew
1fa20 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1fa30 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
1fa40 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  sz*szEntry);.   
1fa50 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1fa60 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
1fa70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1fa80 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
1fa90 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a   pArray = pNew;.
1faa0 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a    }.  z = (char*
1fab0 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  )pArray;.  memse
1fac0 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79  t(&z[n * szEntry
1fad0 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
1fae0 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
1faf0 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
1fb00 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1fb10 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1fb20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
1fb30 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1fb40 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
1fb50 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
1fb60 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
1fb70 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1fb80 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1fb90 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
1fba0 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
1fbb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
1fbc0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
1fbd0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1fbe0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1fbf0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1fc00 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1fc10 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1fc20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1fc30 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1fc40 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
1fc50 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1fc60 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1fc70 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
1fc80 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1fc90 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
1fca0 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
1fcb0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1fcc0 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
1fcd0 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
1fce0 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
1fcf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
1fd00 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1fd10 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1fd20 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1fd30 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1fd40 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1fd50 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
1fd60 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1fd70 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 2d  OBJECT && pList-
1fd80 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
1fd90 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
1fda0 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
1fdb0 20 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61   (void*)pList->a
1fdc0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65  [i].zName, pToke
1fdd0 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
1fde0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1fdf0 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
1fe00 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1fe10 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73  e3IdListDelete(s
1fe20 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1fe30 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1fe40 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1fe50 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1fe60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1fe70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1fe80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1fe90 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
1fea0 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
1feb0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1fec0 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
1fed0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
1fee0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1fef0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1ff00 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
1ff10 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
1ff20 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
1ff30 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
1ff40 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
1ff50 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
1ff60 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
1ff70 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1ff80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1ff90 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1ffa0 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
1ffb0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1ffc0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1ffd0 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
1ffe0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
1fff0 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
20000 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
20010 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n -1;.}../*.** M
20020 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
20030 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e   SrcList object.
20040 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20  .** The SrcList 
20050 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74  object is used t
20060 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
20070 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
20080 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
20090 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65 20 71 75  ment, and the qu
200a0 65 72 79 20 70 6c 61 6e 6e 65 72 20 63 61 6e 6e  ery planner cann
200b0 6f 74 20 64 65 61 6c 20 77 69 74 68 20 6d 6f 72  ot deal with mor
200c0 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20 74 61 62  e.** than 64 tab
200d0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20  les in a join.  
200e0 53 6f 20 61 6e 79 20 76 61 6c 75 65 20 6c 61 72  So any value lar
200f0 67 65 72 20 74 68 61 6e 20 36 34 20 68 65 72 65  ger than 64 here
20100 0a 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e  .** is sufficien
20110 74 20 66 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e  t for most uses.
20120 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73    Smaller values
20130 2c 20 6c 69 6b 65 20 73 61 79 20 31 30 2c 20 61  , like say 10, a
20140 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  re.** appropriat
20150 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61 6e 64 20  e for small and 
20160 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65 64 20 61  memory-limited a
20170 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  pplications..*/.
20180 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
20190 41 58 5f 53 52 43 4c 49 53 54 0a 23 20 64 65 66  AX_SRCLIST.# def
201a0 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
201b0 52 43 4c 49 53 54 20 32 30 30 0a 23 65 6e 64 69  RCLIST 200.#endi
201c0 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20  f../*.** Expand 
201d0 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
201e0 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  ted for the give
201f0 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  n SrcList object
20200 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20   by.** creating 
20210 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73  nExtra new slots
20220 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   beginning at iS
20230 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73  tart.  iStart is
20240 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20   zero based..** 
20250 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65  New slots are ze
20260 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  roed..**.** For 
20270 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65  example, suppose
20280 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69   a SrcList initi
20290 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77  ally contains tw
202a0 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a  o entries: A,B..
202b0 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e  ** To append 3 n
202c0 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20  ew entries onto 
202d0 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73  the end, do this
202e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
202f0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
20300 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33  (db, pSrclist, 3
20310 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65  , 2);.**.** Afte
20320 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  r the call above
20330 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69   it would contai
20340 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e  n:  A, B, nil, n
20350 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74  il, nil..** If t
20360 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65  he iStart argume
20370 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e  nt had been 1 in
20380 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e  stead of 2, then
20390 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77   the result.** w
203a0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20  ould have been: 
203b0 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   A, nil, nil, ni
203c0 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e  l, B.  To prepen
203d0 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c  d the new slots,
203e0 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76  .** the iStart v
203f0 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e  alue would be 0.
20400 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65    The result the
20410 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e  n would.** be: n
20420 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c  il, nil, nil, A,
20430 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d   B..**.** If a m
20440 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
20450 20 66 61 69 6c 73 20 6f 72 20 74 68 65 20 53 72   fails or the Sr
20460 63 4c 69 73 74 20 62 65 63 6f 6d 65 73 20 74 6f  cList becomes to
20470 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76 65 0a 2a  o large, leave.*
20480 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  * the original S
20490 72 63 4c 69 73 74 20 75 6e 63 68 61 6e 67 65 64  rcList unchanged
204a0 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20 61  , return NULL, a
204b0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
204c0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
204d0 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c 69  pParse..*/.SrcLi
204e0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
204f0 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 50 61 72  stEnlarge(.  Par
20500 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
20510 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
20520 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 65 72  xt into which er
20530 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65  rors are reporte
20540 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  d */.  SrcList *
20550 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
20560 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
20570 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
20580 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
20590 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
205a0 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
205b0 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
205c0 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
205d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
205e0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
205f0 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
20600 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
20610 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
20620 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
20630 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
20640 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
20650 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
20660 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
20670 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
20680 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
20690 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
206a0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
206b0 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
206c0 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28  eeded */.  if( (
206d0 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  u32)pSrc->nSrc+n
206e0 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
206f0 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
20700 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 73 71 6c  t *pNew;.    sql
20710 69 74 65 33 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f  ite3_int64 nAllo
20720 63 20 3d 20 32 2a 28 73 71 6c 69 74 65 33 5f 69  c = 2*(sqlite3_i
20730 6e 74 36 34 29 70 53 72 63 2d 3e 6e 53 72 63 2b  nt64)pSrc->nSrc+
20740 6e 45 78 74 72 61 3b 0a 20 20 20 20 73 71 6c 69  nExtra;.    sqli
20750 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
20760 2d 3e 64 62 3b 0a 0a 20 20 20 20 69 66 28 20 70  ->db;..    if( p
20770 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
20780 3e 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  >=SQLITE_MAX_SRC
20790 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 73 71  LIST ){.      sq
207a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
207b0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
207c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
207d0 73 2c 20 6d 61 78 3a 20 25 64 22 2c 0a 20 20 20  s, max: %d",.   
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52     SQLITE_MAX_SR
20800 43 4c 49 53 54 29 3b 0a 20 20 20 20 20 20 72 65  CLIST);.      re
20810 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
20820 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3e 53 51 4c    if( nAlloc>SQL
20830 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20  ITE_MAX_SRCLIST 
20840 29 20 6e 41 6c 6c 6f 63 20 3d 20 53 51 4c 49 54  ) nAlloc = SQLIT
20850 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 3b 0a 20  E_MAX_SRCLIST;. 
20860 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
20870 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
20880 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
20890 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63      sizeof(*pSrc
208a0 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ) + (nAlloc-1)*s
208b0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
208c0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
208d0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  w==0 ){.      as
208e0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
208f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
20900 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
20910 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
20920 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
20930 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a  c = nAlloc;.  }.
20940 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
20950 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
20960 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
20970 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
20980 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
20990 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
209a0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
209b0 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
209c0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
209d0 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
209e0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
209f0 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
20a00 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
20a10 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
20a20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
20a30 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
20a40 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
20a50 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
20a60 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
20a70 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
20a80 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
20a90 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
20aa0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
20ab0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
20ac0 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
20ad0 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
20ae0 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
20af0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
20b00 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
20b10 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
20b20 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
20b30 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
20b40 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
20b50 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
20b60 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
20b70 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
20b80 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
20b90 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
20ba0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
20bb0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
20bc0 65 72 72 6f 72 20 6f 72 20 69 66 20 74 68 65 0a  error or if the.
20bd0 2a 2a 20 53 72 63 4c 69 73 74 20 67 72 6f 77 73  ** SrcList grows
20be0 20 74 6f 20 6c 61 72 67 65 2e 20 20 54 68 65 20   to large.  The 
20bf0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
20c00 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
20c10 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
20c20 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
20c30 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
20c40 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
20c50 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
20c60 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
20c70 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
20c80 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
20c90 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
20ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20cb0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
20cc0 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
20cd0 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
20ce0 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
20cf0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
20d00 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
20d10 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
20d20 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
20d30 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
20d40 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
20d50 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
20d60 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
20d70 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
20d80 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
20d90 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
20da0 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
20db0 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
20dc0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
20dd0 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
20de0 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
20df0 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
20e00 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
20e10 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
20e20 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
20e30 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
20e40 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
20e50 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
20e60 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
20e70 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
20e80 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
20e90 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
20ea0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20eb0 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
20ec0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
20ed0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20ee0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
20ef0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
20f00 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
20f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
20f20 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
20f30 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
20f40 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
20f50 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
20f60 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
20f70 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
20f80 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
20f90 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
20fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
20fb0 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
20fc0 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
20fd0 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
20fe0 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
20ff0 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
21000 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
21010 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
21020 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
21030 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
21040 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
21050 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
21060 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
21070 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
21080 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
21090 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
210a0 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
210b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
210c0 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
210d0 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
210e0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2c 20 69  rsing context, i
210f0 6e 20 77 68 69 63 68 20 65 72 72 6f 72 73 20 61  n which errors a
21100 72 65 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20  re reported */. 
21110 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
21120 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
21130 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
21140 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
21150 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
21160 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
21170 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
21180 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
21190 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
211a0 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
211b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
211c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
211d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
211e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
211f0 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
21200 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
21210 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
21220 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
21230 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
21240 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
21250 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
21260 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
21270 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
21280 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
21290 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
212a0 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
212b0 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  ->db, sizeof(Src
212c0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
212d0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
212e0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
212f0 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
21300 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
21310 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
21320 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
21330 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
21340 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
21350 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
21360 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
21370 72 63 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73  rcList *pNew = s
21380 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
21390 61 72 67 65 28 70 50 61 72 73 65 2c 20 70 4c 69  arge(pParse, pLi
213a0 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53  st, 1, pList->nS
213b0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  rc);.    if( pNe
213c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
213d0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
213e0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
213f0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
21400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21410 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
21420 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20    }.  }.  pItem 
21430 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
21440 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
21450 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
21460 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
21470 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
21480 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
21490 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
214a0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
214b0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
214c0 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
214d0 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
214e0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
214f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
21500 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  db, pTable);.  }
21510 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d  else{.    pItem-
21520 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
21530 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
21540 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , pTable);.    p
21550 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
21560 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
21570 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
21580 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72  * Assign VdbeCur
21590 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  sor index number
215a0 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
215b0 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
215c0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
215d0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
215e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
215f0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
21600 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
21610 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21620 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
21630 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
21640 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
21650 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
21660 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
21670 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
21680 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
21690 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
216a0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
216b0 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
216c0 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
216d0 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
216e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
216f0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
21700 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
21710 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
21720 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
21730 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
21740 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
21750 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
21760 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
21770 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
21780 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
21790 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
217a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
217b0 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  cListDelete(sqli
217c0 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
217d0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
217e0 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
217f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21800 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
21810 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
21820 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
21830 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
21840 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
21850 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
21860 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
21870 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
21880 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21890 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
218a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
218b0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41  ee(db, pItem->zA
218c0 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
218d0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
218e0 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62  edBy ) sqlite3Db
218f0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
21900 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
21910 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
21920 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71  g.isTabFunc ) sq
21930 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
21940 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ete(db, pItem->u
21950 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20  1.pFuncArg);.   
21960 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
21970 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ble(db, pItem->p
21980 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
21990 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
219a0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
219b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
219c0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
219d0 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
219e0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
219f0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73  e(db, pItem->pUs
21a00 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
21a10 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
21a20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
21a30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
21a40 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
21a50 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
21a60 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
21a70 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
21a80 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
21a90 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
21aa0 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
21ab0 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
21ac0 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
21ad0 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
21ae0 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
21af0 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
21b00 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
21b10 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
21b20 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
21b30 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
21b40 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
21b50 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
21b60 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
21b70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
21b80 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
21b90 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
21ba0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
21bb0 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
21bc0 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
21bd0 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
21be0 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69   term has an ali
21bf0 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
21c00 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
21c10 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
21c20 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
21c30 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
21c40 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
21c50 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
21c60 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
21c70 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
21c80 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
21c90 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
21ca0 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
21cb0 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
21cc0 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
21cd0 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
21ce0 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
21cf0 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
21d00 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
21d10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
21d20 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
21d30 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
21d40 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
21d50 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
21d60 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
21d70 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
21d80 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
21d90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
21da0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
21db0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
21dc0 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
21dd0 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
21de0 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
21df0 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
21e00 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
21e10 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
21e20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
21e30 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
21e40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21e50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
21e60 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
21e70 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
21e80 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
21e90 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
21ea0 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
21eb0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
21ec0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
21ed0 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
21ee0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
21ef0 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
21f00 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
21f10 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
21f20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
21f30 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
21f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21f50 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
21f60 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
21f70 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
21f80 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
21f90 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
21fa0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
21fb0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
21fc0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
21fd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21fe0 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
21ff0 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
22000 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22010 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
22020 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
22030 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
22040 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
22050 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
22060 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
22070 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
22080 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
22090 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
220a0 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 54 61  d(pParse, p, pTa
220b0 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
220c0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
220d0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
220e0 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
220f0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63   assert( p->nSrc
22100 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  >0 );.  pItem = 
22110 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
22120 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 61  ;.  assert( (pTa
22130 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62  ble==0)==(pDatab
22140 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  ase==0) );.  ass
22150 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
22160 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61 62 61 73  e==0 || pDatabas
22170 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 49 4e  e!=0 );.  if( IN
22180 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26  _RENAME_OBJECT &
22190 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
221a0 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  {.    Token *pTo
221b0 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53 28 70 44  ken = (ALWAYS(pD
221c0 61 74 61 62 61 73 65 29 20 26 26 20 70 44 61 74  atabase) && pDat
221d0 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74  abase->z) ? pDat
221e0 61 62 61 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a  abase : pTable;.
221f0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
22200 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
22210 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
22220 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  pToken);.  }.  a
22230 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30  ssert( pAlias!=0
22240 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73   );.  if( pAlias
22250 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
22260 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
22270 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
22280 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
22290 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
222a0 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
222b0 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
222c0 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
222d0 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
222e0 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e  eturn p;.. appen
222f0 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  d_from_error:.  
22300 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
22310 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
22320 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20  ete(db, pOn);.  
22330 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
22340 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b  ete(db, pUsing);
22350 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
22360 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
22370 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  uery);.  return 
22380 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
22390 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72  an INDEXED BY or
223a0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
223b0 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  use to the most 
223c0 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a  recently added .
223d0 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ** element of th
223e0 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61  e source-list pa
223f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
22400 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
22410 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
22420 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72  istIndexedBy(Par
22430 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
22440 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70  ist *p, Token *p
22450 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73  IndexedBy){.  as
22460 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79  sert( pIndexedBy
22470 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26  !=0 );.  if( p &
22480 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e  & pIndexedBy->n>
22490 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
224a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
224b0 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
224c0 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
224d0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
224e0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
224f0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
22500 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
22510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22520 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
22530 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
22540 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
22550 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
22560 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
22570 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
22580 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
22590 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
225a0 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
225b0 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
225c0 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
225d0 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
225e0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
225f0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
22600 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
22610 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
22620 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
22630 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
22640 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
22650 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
22660 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
22670 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
22680 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 31  .isIndexedBy = 1
22690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
226a0 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73  *.** Add the lis
226b0 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
226c0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53  guments to the S
226d0 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72  rcList entry for
226e0 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75   a.** table-valu
226f0 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed-function..*/.
22700 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
22710 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73  istFuncArgs(Pars
22720 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
22730 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  st *p, ExprList 
22740 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
22750 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
22760 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
22770 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
22780 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
22790 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74  t( pItem->fg.not
227a0 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
227b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
227c0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d  >fg.isIndexedBy=
227d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
227e0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
227f0 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
22800 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
22810 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  rg = pList;.    
22820 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
22830 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  unc = 1;.  }else
22840 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
22850 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
22860 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
22870 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
22880 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
22890 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
228a0 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
228b0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
228c0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
228d0 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
228e0 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
228f0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
22900 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
22910 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
22920 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
22930 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
22940 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
22950 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
22960 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
22970 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
22980 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
22990 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
229a0 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
229b0 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
229c0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
229d0 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
229e0 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
229f0 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
22a00 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
22a10 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
22a20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
22a30 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
22a40 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
22a50 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
22a60 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
22a70 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
22a80 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
22a90 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
22aa0 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
22ab0 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
22ac0 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
22ad0 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
22ae0 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
22af0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
22b00 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
22b10 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31   for(i=p->nSrc-1
22b20 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
22b30 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f     p->a[i].fg.jo
22b40 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
22b50 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  1].fg.jointype;.
22b60 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
22b70 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
22b80 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
22b90 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
22ba0 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73  de for a BEGIN s
22bb0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
22bc0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
22bd0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
22be0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
22bf0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
22c00 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
22c10 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
22c20 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
22c30 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
22c40 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
22c50 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
22c60 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
22c70 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
22c80 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
22c90 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
22ca0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
22cb0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
22cc0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
22cd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
22ce0 20 74 79 70 65 3d 3d 54 4b 5f 49 4d 4d 45 44 49   type==TK_IMMEDI
22cf0 41 54 45 20 7c 7c 20 74 79 70 65 3d 3d 54 4b 5f  ATE || type==TK_
22d00 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
22d10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
22d20 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
22d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22d40 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
22d50 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
22d60 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
22d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22d80 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
22d90 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
22da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22db0 33 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  3(v, OP_AutoComm
22dc0 69 74 2c 20 30 2c 20 30 2c 20 28 74 79 70 65 3d  it, 0, 0, (type=
22dd0 3d 54 4b 5f 43 4f 4e 43 55 52 52 45 4e 54 29 29  =TK_CONCURRENT))
22de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
22df0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
22e00 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  r a COMMIT or RO
22e10 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
22e20 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f  ..** Code for RO
22e30 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61  LLBACK is genera
22e40 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b  ted if eType==TK
22e50 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65  _ROLLBACK.  Othe
22e60 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73  rwise.** code is
22e70 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61   generated for a
22e80 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64   COMMIT..*/.void
22e90 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73   sqlite3EndTrans
22ea0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
22eb0 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29  arse, int eType)
22ec0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
22ed0 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a  nt isRollback;..
22ee0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22ef0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
22f00 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
22f10 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
22f20 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20  e==TK_COMMIT || 
22f30 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c  eType==TK_END ||
22f40 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42   eType==TK_ROLLB
22f50 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62  ACK );.  isRollb
22f60 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f  ack = eType==TK_
22f70 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20  ROLLBACK;.  if( 
22f80 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22f90 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22fa0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20  TRANSACTION, .  
22fb0 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20       isRollback 
22fc0 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22  ? "ROLLBACK" : "
22fd0 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
22fe0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
22ff0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
23000 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
23010 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
23020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23030 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
23040 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b  t, 1, isRollback
23050 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23060 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
23070 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
23080 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
23090 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
230a0 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
230b0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
230c0 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
230d0 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
230e0 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
230f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
23100 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
23110 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
23120 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
23130 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
23140 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
23150 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
23160 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
23170 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
23180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23190 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
231a0 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
231b0 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
231c0 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
231d0 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
231e0 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
231f0 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
23200 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
23210 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
23220 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
23230 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
23240 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
23250 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
23260 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
23270 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
23280 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
23290 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
232a0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
232b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
232c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
232d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
232e0 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
232f0 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
23300 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
23310 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23320 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
23330 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
23340 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
23350 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
23360 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
23370 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
23380 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
23390 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
233a0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
233b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
233c0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
233d0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
233e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
233f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
23400 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
23410 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
23420 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
23430 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
23440 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
23450 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
23460 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
23470 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23480 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
23490 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
234a0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
234b0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
234c0 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
234d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
234e0 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
234f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
23500 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
23510 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23520 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
23530 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
23540 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
23550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23570 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23580 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
23590 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
235a0 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
235b0 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
235c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
235d0 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
235e0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
235f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23600 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
23610 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
23620 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
23630 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
23640 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
23650 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
23660 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
23670 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
23680 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
23690 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
236a0 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
236b0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
236c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
236d0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
236e0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
236f0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
23700 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
23710 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
23720 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
23730 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
23740 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
23750 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
23760 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
23770 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
23780 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
23790 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
237a0 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
237b0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
237c0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
237d0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
237e0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
237f0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
23800 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
23810 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
23820 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
23830 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
23840 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
23850 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
23860 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
23870 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
23880 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
23890 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
238a0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
238b0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  2 );.  assert( s
238c0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
238d0 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62  xHeld(pParse->db
238e0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69  , iDb, 0) );.  i
238f0 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54  f( DbMaskTest(pT
23900 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
23910 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a  ask, iDb)==0 ){.
23920 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54      DbMaskSet(pT
23930 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
23940 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  ask, iDb);.    i
23950 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
23960 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
23970 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
23980 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
23990 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
239a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
239b0 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
239c0 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
239d0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
239e0 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
239f0 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
23a00 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
23a10 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
23a20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
23a30 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
23a40 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
23a50 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
23a60 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
23a70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
23a80 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23a90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23aa0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
23ab0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
23ac0 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
23ad0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
23ae0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
23af0 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
23b00 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
23b10 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
23b20 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
23b30 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
23b40 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
23b50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
23b60 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
23b70 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
23b80 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
23b90 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
23ba0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
23bb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
23bc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23bd0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
23be0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
23bf0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
23c00 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
23c10 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
23c20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
23c30 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
23c40 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
23c50 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
23c60 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
23c70 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
23c80 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
23c90 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
23ca0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
23cb0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
23cc0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
23cd0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
23ce0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
23cf0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
23d00 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
23d10 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
23d20 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
23d30 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
23d40 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
23d50 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
23d60 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
23d70 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
23d80 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
23d90 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
23da0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
23db0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
23dc0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
23dd0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
23de0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
23df0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
23e00 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
23e10 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
23e20 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
23e30 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
23e40 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
23e50 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
23e60 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
23e70 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
23e80 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
23e90 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
23ea0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
23eb0 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
23ec0 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
23ed0 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
23ee0 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
23ef0 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
23f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
23f10 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
23f20 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
23f30 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
23f40 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
23f50 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
23f60 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
23f70 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
23f80 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
23f90 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
23fa0 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
23fb0 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
23fc0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
23fd0 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
23fe0 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
23ff0 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
24000 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
24010 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
24020 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
24030 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
24040 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
24050 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
24060 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
24070 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
24080 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
24090 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
240a0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
240b0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
240c0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
240d0 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
240e0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
240f0 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
24100 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
24110 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
24120 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
24130 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
24140 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
24150 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
24160 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
24170 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
24180 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
24190 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
241a0 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
241b0 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
241c0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
241d0 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
241e0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
241f0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
24200 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
24210 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
24220 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
24230 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
24240 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
24250 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
24260 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
24270 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
24280 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
24290 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
242a0 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
242b0 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
242c0 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
242d0 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
242e0 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
242f0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
24300 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
24310 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
24320 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
24330 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
24340 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
24350 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
24360 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
24370 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
24380 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
24390 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
243a0 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
243b0 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
243c0 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
243d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
243e0 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
243f0 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
24400 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
24410 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
24420 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
24430 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
24440 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24450 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
24460 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
24470 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
24480 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
24490 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
244a0 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
244b0 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
244c0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
244d0 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
244e0 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
244f0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
24500 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
24510 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
24520 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
24530 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
24540 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
24550 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
24560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
24570 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
24580 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
24590 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
245a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
245b0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
245c0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
245d0 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
245e0 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
245f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
24600 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
24610 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
24620 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
24630 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
24640 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
24650 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
24660 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
24670 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
24680 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
24690 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
246a0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
246b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
246c0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
246d0 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
246e0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
246f0 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
24700 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
24710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
24720 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
24730 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
24740 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
24750 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
24760 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
24770 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  type);.  sqlite3
24780 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
24790 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
247a0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
247b0 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
247c0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
247d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
247e0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
247f0 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
24800 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
24810 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
24820 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24830 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
24840 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
24850 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
24860 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
24870 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
24880 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
24890 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
248a0 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
248b0 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
248c0 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
248d0 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
248e0 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
248f0 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
24900 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e  errMsg, pParse->
24910 64 62 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  db, 0, 0, .     
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
24940 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
24950 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 69 66 28  _LENGTH]);.  if(
24960 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
24970 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
24980 74 72 5f 61 70 70 65 6e 64 66 28 26 65 72 72 4d  tr_appendf(&errM
24990 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22  sg, "index '%q'"
249a0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
249b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
249c0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
249d0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
249e0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
249f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
24a00 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
24a10 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  0 );.      zCol 
24a20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
24a30 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
24a40 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
24a50 20 6a 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72   j ) sqlite3_str
24a60 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  _append(&errMsg,
24a70 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20   ", ", 2);.     
24a80 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
24a90 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20  endall(&errMsg, 
24aa0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
24ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
24ac0 61 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  append(&errMsg, 
24ad0 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ".", 1);.      s
24ae0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
24af0 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43  dall(&errMsg, zC
24b00 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ol);.    }.  }. 
24b10 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
24b20 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
24b30 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
24b40 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
24b50 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50  pParse, .    IsP
24b60 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
24b70 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f  Idx) ? SQLITE_CO
24b80 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
24b90 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  KEY .           
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   : SQLITE_CONSTR
24bc0 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
24bd0 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20   onError, zErr, 
24be0 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43  P4_DYNAMIC, P5_C
24bf0 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
24c00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ;.}.../*.** Code
24c10 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
24c20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  to non-unique ro
24c30 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
24c40 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61  ite3RowidConstra
24c50 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
24c60 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
24c70 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24c80 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
24c90 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
24ca0 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
24cb0 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  thm */.  Table *
24cc0 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68  pTab       /* Th
24cd0 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
24ce0 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
24cf0 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20  d */ .){.  char 
24d00 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b  *zMsg;.  int rc;
24d10 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
24d20 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73  ey>=0 ){.    zMs
24d30 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
24d40 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
24d50 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
24d60 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24d80 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
24d90 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
24da0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
24db0 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
24dc0 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  YKEY;.  }else{. 
24dd0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
24de0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
24df0 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c  >db, "%s.rowid",
24e00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
24e10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
24e20 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b  ONSTRAINT_ROWID;
24e30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
24e40 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
24e50 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72  rse, rc, onError
24e60 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
24e70 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IC,.            
24e80 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43              P5_C
24e90 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
24ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
24eb0 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
24ec0 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
24ed0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
24ee0 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
24ef0 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
24f00 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
24f10 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
24f20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24f30 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
24f40 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
24f50 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
24f60 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
24f70 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  dex){.  int i;. 
24f80 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
24f90 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
24fa0 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
24fb0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
24fc0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
24fd0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
24fe0 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
24ff0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f   || pIndex->aiCo
25000 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20  lumn[i]<0 );.   
25010 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
25020 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30  olumn[i]>=0 && 0
25030 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
25040 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
25050 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
25060 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25070 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
25080 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
25090 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
250a0 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
250b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
250c0 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
250d0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
250e0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
250f0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
25100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25110 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
25120 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
25130 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
25140 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
25150 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
25160 6c 29 7b 0a 20 20 69 66 28 20 21 49 73 56 69 72  l){.  if( !IsVir
25170 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
25180 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
251a0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
251b0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
251c0 2f 0a 0a 20 20 20 20 66 6f 72 28 70 49 6e 64 65  /..    for(pInde
251d0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
251e0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
251f0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
25200 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d       if( zColl==
25210 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
25220 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
25230 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  x) ){.        in
25240 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
25250 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
25260 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
25270 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
25280 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
25290 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
252a0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
252b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
252c0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
252d0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
252e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
252f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
25300 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
25310 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
25320 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
25330 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
25340 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
25350 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
25360 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
25370 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
25380 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
25390 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
253a0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
253b0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
253c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
253d0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
253e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
253f0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
25400 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25420 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
25430 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
25440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25450 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
25460 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
25470 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
25480 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25490 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
254a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
254b0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
254d0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
254e0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
254f0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
25500 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25510 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
25520 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
25530 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25540 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
25550 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
25560 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
25570 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
25580 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
25590 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
255a0 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
255b0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
255c0 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
255d0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
255e0 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
255f0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
25600 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
25610 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
25620 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
25630 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
25640 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
25650 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
25660 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
25670 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
25680 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25690 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
256a0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
256b0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256d0 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
256e0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
256f0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
25700 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
25710 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
25720 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
25730 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
25740 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
25750 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
25760 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
25770 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
25780 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
25790 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
257a0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
257b0 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
257c0 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
257d0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
257e0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
257f0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
25800 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
25810 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
25820 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
25830 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
25840 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
25850 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25860 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
25870 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
25880 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
25890 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
258a0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
258b0 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
258c0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
258d0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
258e0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
258f0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
25900 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
25910 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
25920 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
25950 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
25960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
25970 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25980 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
25990 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
259a0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
259b0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
259c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
259d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
259e0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
259f0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
25a00 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
25a10 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
25a40 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
25a50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
25a60 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
25a70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
25a80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
25a90 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
25aa0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
25ab0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
25ac0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
25ad0 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
25ae0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
25af0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
25b00 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25b10 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
25b20 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
25b30 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
25b40 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
25b50 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
25b60 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
25b70 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
25b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
25b90 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
25ba0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
25bb0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
25bc0 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
25bd0 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
25be0 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
25bf0 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
25c00 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
25c10 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
25c20 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
25c30 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
25c40 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
25c50 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
25c60 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
25c70 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
25c80 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
25c90 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
25ca0 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
25cb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
25cc0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
25cd0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
25ce0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
25cf0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25d00 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
25d10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
25d20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
25d30 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
25d40 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
25d50 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
25d60 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
25d70 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
25d80 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
25d90 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
25da0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
25db0 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
25dc0 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
25dd0 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
25de0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
25df0 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
25e00 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
25e10 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
25e20 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
25e30 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
25e40 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
25e50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25e60 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
25e70 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
25e80 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
25e90 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
25ea0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
25eb0 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
25ec0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
25ed0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
25ee0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
25ef0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
25f00 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
25f10 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
25f20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
25f30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
25f40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25f50 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
25f60 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
25f70 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
25f80 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
25f90 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66   Return a KeyInf
25fa0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
25fb0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
25fc0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e  for the given In
25fd0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  dex..**.** The c
25fe0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76  aller should inv
25ff0 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oke sqlite3KeyIn
26000 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  foUnref() on the
26010 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
26020 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20  .** when it has 
26030 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69  finished using i
26040 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  t..*/.KeyInfo *s
26050 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
26060 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
26070 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
26080 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
26090 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
260a0 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65  olumn;.  int nKe
260b0 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  y = pIdx->nKeyCo
260c0 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  l;.  KeyInfo *pK
260d0 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ey;.  if( pParse
260e0 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
260f0 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75  0;.  if( pIdx->u
26100 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  niqNotNull ){.  
26110 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
26120 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
26130 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e  rse->db, nKey, n
26140 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  Col-nKey);.  }el
26150 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  se{.    pKey = s
26160 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
26170 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
26180 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  Col, 0);.  }.  i
26190 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
261a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
261b0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
261c0 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f  (pKey) );.    fo
261d0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
261e0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
261f0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
26200 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
26210 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
26220 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71  l[i] = zColl==sq
26230 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f  lite3StrBINARY ?
26240 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20   0 :.           
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
26260 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
26270 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
26280 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
26290 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
262a0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
262b0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
262c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
262d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
262e0 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
262f0 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f  E_ERROR_MISSING_
26300 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20  COLLSEQ );.     
26310 20 69 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75   if( pIdx->bNoQu
26320 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ery==0 ){.      
26330 20 20 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20    /* Deactivate 
26340 74 68 65 20 69 6e 64 65 78 20 62 65 63 61 75 73  the index becaus
26350 65 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  e it contains an
26360 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69   unknown collati
26370 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ng.        ** se
26380 71 75 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c  quence.  The onl
26390 79 20 77 61 79 20 74 6f 20 72 65 61 63 74 69 76  y way to reactiv
263a0 65 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  e the index is t
263b0 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20  o reload the.   
263c0 20 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20       ** schema. 
263d0 20 41 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73   Adding the miss
263e0 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ing collating se
263f0 71 75 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65  quence later doe
26400 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
26410 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e   reactive the in
26420 64 65 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63  dex.  The applic
26430 61 74 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68  ation had the ch
26440 61 6e 63 65 20 74 6f 20 72 65 67 69 73 74 65 72  ance to register
26450 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
26460 6d 69 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73  missing index us
26470 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
26480 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63  n-needed callbac
26490 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20  k.  For.        
264a0 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53  ** simplicity, S
264b0 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67  QLite will not g
264c0 69 76 65 20 74 68 65 20 61 70 70 6c 69 63 61 74  ive the applicat
264d0 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61  ion a second cha
264e0 6e 63 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nce..        */.
264f0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e          pIdx->bN
26500 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  oQuery = 1;.    
26510 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
26520 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45   SQLITE_ERROR_RE
26530 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TRY;.      }.   
26540 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
26550 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20  oUnref(pKey);.  
26560 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
26570 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26580 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pKey;.}..#ifnde
26590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
265a0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  E./* .** This ro
265b0 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
265c0 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79   once per CTE by
265d0 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
265e0 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20  e parsing a .** 
265f0 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f  WITH clause. .*/
26600 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69  .With *sqlite3Wi
26610 74 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a  thAdd(.  Parse *
26620 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
26630 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
26640 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ext */.  With *p
26650 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
26660 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54   /* Existing WIT
26670 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  H clause, or NUL
26680 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
26690 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
266a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
266b0 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20  mmon-table */.  
266c0 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69  ExprList *pArgli
266d0 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f  st,     /* Optio
266e0 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  nal column name 
266f0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62  list for the tab
26700 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  le */.  Select *
26710 70 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20  pQuery          
26720 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f  /* Query used to
26730 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
26740 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  table */.){.  sq
26750 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26760 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a  se->db;.  With *
26770 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pNew;.  char *zN
26780 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ame;..  /* Check
26790 20 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61   that the CTE na
267a0 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74  me is unique wit
267b0 68 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c  hin this WITH cl
267c0 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f  ause. If.  ** no
267d0 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f  t, store an erro
267e0 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  r in the Parse s
267f0 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a  tructure. */.  z
26800 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
26810 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
26820 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
26830 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70    if( zName && p
26840 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
26850 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
26860 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
26870 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
26880 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
26890 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d  ame, pWith->a[i]
268a0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
268b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
268c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
268d0 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61  uplicate WITH ta
268e0 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  ble name: %s", z
268f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
26900 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
26910 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
26920 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
26930 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
26940 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
26950 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
26960 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
26970 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
26980 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
26990 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
269a0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
269b0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
269c0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
269d0 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
269e0 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a  t( (pNew!=0 && z
269f0 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e  Name!=0) || db->
26a00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
26a10 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
26a20 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
26a30 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
26a40 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
26a50 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
26a60 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
26a70 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
26a80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
26a90 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
26aa0 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
26ab0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
26ac0 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
26ad0 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
26ae0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
26af0 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
26b00 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
26b10 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
26b20 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
26b30 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
26b40 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30  Cte].zCteErr = 0
26b50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
26b60 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
26b70 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
26b80 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
26b90 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
26ba0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
26bb0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26bc0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
26bd0 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
26be0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
26bf0 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
26c00 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
26c10 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
26c20 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
26c30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
26c40 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
26c50 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
26c60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
26c70 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
26c80 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
26c90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
26ca0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
26cb0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
26cc0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
26cd0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
26ce0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26cf0 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
26d00 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
26d10 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
26d20 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.