/ Hex Artifact Content
Login

Artifact da448a48fc8f4020a9ddcdea0ded1d35513f95e0fca7fdd28beef5b349e88110:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
07f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
0800: 52 45 4e 54 0a 20 20 69 66 28 20 69 44 62 3d 3d  RENT.  if( iDb==
0810: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  1 ) return;.  if
0820: 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  ( !sqlite3BtreeS
0830: 68 61 72 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  harable(pParse->
0840: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
0850: 29 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  ) ) return;.#end
0860: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
0870: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0880: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0890: 20 70 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d   p = &pToplevel-
08a0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
08b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d      if( p->iDb==
08c0: 69 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d  iDb && p->iTab==
08d0: 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d  iTab ){.      p-
08e0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28  >isWriteLock = (
08f0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c  p->isWriteLock |
0900: 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  | isWriteLock);.
0910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65    }.  }..  nByte
0930: 73 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  s = sizeof(Table
0940: 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70 6c 65 76  Lock) * (pToplev
0950: 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31  el->nTableLock+1
0960: 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
0970: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20  aTableLock =.   
0980: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
0990: 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f 70 6c 65  locOrFree(pTople
09a0: 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70 6c 65 76  vel->db, pToplev
09b0: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20  el->aTableLock, 
09c0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70  nBytes);.  if( p
09d0: 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65  Toplevel->aTable
09e0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
09f0: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0a00: 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65 76 65 6c  leLock[pToplevel
0a10: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b  ->nTableLock++];
0a20: 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20 69 44  .    p->iDb = iD
0a30: 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 20 3d  b;.    p->iTab =
0a40: 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73   iTab;.    p->is
0a50: 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72  WriteLock = isWr
0a60: 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e  iteLock;.    p->
0a70: 7a 4c 6f 63 6b 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zLockName = zNam
0a80: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
0a90: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c  pToplevel->nTabl
0aa0: 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  eLock = 0;.    s
0ab0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
0ac0: 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20  Toplevel->db);. 
0ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0ae0: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0af0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b00: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b10: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b20: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0b30: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0b40: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0b50: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0b60: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0b70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0b80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0b90: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0ba0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0bb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0bc0: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0bd0: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0be0: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0bf0: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c00: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c20: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0c30: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0c40: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0c50: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0c60: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0c70: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0c80: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0c90: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0ca0: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0cb0: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 70 2d 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c     p->zLockName,
0ce0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
0cf0: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d00: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d10: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
0d30: 66 20 74 68 65 20 67 69 76 65 6e 20 79 44 62 4d  f the given yDbM
0d40: 61 73 6b 20 6f 62 6a 65 63 74 20 69 73 20 65 6d  ask object is em
0d50: 70 74 79 20 2d 20 69 66 20 69 74 20 63 6f 6e 74  pty - if it cont
0d60: 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31 20 62 69 74  ains no.** 1 bit
0d70: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
0d80: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
0d90: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 29 20  DbMaskAllZero() 
0da0: 61 6e 64 20 44 62 4d 61 73 6b 4e 6f 74 5a 65 72  and DbMaskNotZer
0db0: 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f 73 20 77 68  o().** macros wh
0dc0: 65 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  en SQLITE_MAX_AT
0dd0: 54 41 43 48 45 44 20 69 73 20 67 72 65 61 74 65  TACHED is greate
0de0: 72 20 74 68 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69  r than 30..*/.#i
0df0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
0e00: 41 43 48 45 44 3e 33 30 0a 69 6e 74 20 73 71 6c  ACHED>30.int sql
0e10: 69 74 65 33 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  ite3DbMaskAllZer
0e20: 6f 28 79 44 62 4d 61 73 6b 20 6d 29 7b 0a 20 20  o(yDbMask m){.  
0e30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
0e40: 3b 20 69 3c 73 69 7a 65 6f 66 28 79 44 62 4d 61  ; i<sizeof(yDbMa
0e50: 73 6b 29 3b 20 69 2b 2b 29 20 69 66 28 20 6d 5b  sk); i++) if( m[
0e60: 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
0e70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
0e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0e90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0ea0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0eb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0ec0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0ed0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0ee0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0ef0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0f00: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0f10: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0f20: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0f30: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0f40: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0f50: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0f60: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0f70: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0f80: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0f90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0fa0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0fb0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0fc0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0fd0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0fe0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0ff0: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
1000: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
1010: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1020: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1030: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1040: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
1050: 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1060: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1070: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
1080: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
1090: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
10a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
10b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
10d0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
10e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
10f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
1100: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1110: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1120: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1130: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1140: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1150: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1160: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1170: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
1180: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
1190: 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  e .       || sql
11a0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
11b0: 79 41 62 6f 72 74 28 76 2c 20 70 50 61 72 73 65  yAbort(v, pParse
11c0: 2d 3e 6d 61 79 41 62 6f 72 74 29 29 3b 0a 20 20  ->mayAbort));.  
11d0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
11e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
11f0: 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66  , OP_Halt);..#if
1200: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
1210: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
1220: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  if( pParse->nTab
1230: 6c 65 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e  leLock>0 && db->
1240: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 73 65        sqlite3Use
1260: 72 41 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20  rAuthInit(db);. 
1270: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
1280: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
1290: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
12a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12b0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20  g(pParse, "user 
12c0: 6e 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65  not authenticate
12d0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  d");.        pPa
12e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
12f0: 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20 20 20  _AUTH_USER;.    
1300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1320: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
1330: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
1340: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
1350: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
1360: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
1370: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
1380: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
1390: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
13a0: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
13b0: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
13c0: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
13d0: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
13e0: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
13f0: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
1400: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
1410: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
1420: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
1430: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
1440: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
1450: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1460: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1470: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20  locFailed==0 .  
1480: 20 20 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e     && (DbMaskNon
1490: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Zero(pParse->coo
14a0: 6b 69 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72  kieMask) || pPar
14b0: 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a  se->pConstExpr).
14c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
14d0: 20 69 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61   iDb, i;.      a
14e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
14f0: 62 65 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f  beGetOp(v, 0)->o
1500: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29  pcode==OP_Init )
1510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1520: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30  dbeJumpHere(v, 0
1530: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1540: 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  =0; iDb<db->nDb;
1550: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
1560: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1570: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 44 62  ;.        if( Db
1580: 4d 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d  MaskTest(pParse-
1590: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
15a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
15b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
15d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70   iDb);.        p
15e0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
15f0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
1600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1610: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20  beAddOp4Int(v,. 
1620: 20 20 20 20 20 20 20 20 20 4f 50 5f 54 72 61 6e           OP_Tran
1630: 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20  saction,        
1640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1650: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
1660: 20 20 20 69 44 62 2c 20 20 20 20 20 20 20 20 20     iDb,         
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
1690: 20 20 20 20 20 20 20 20 20 44 62 4d 61 73 6b 54           DbMaskT
16a0: 65 73 74 28 70 50 61 72 73 65 2d 3e 77 72 69 74  est(pParse->writ
16b0: 65 4d 61 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50  eMask,iDb), /* P
16c0: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  2 */.          p
16d0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
16e0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
16f0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
1700: 20 20 20 20 20 70 53 63 68 65 6d 61 2d 3e 69 47       pSchema->iG
1710: 65 6e 65 72 61 74 69 6f 6e 20 20 20 20 20 20 20  eneration       
1720: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
1730: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1740: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1750: 2e 62 75 73 79 3d 3d 30 20 29 20 73 71 6c 69 74  .busy==0 ) sqlit
1760: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1770: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
1780: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 0a 20 20  beComment((v,.  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 73 65              "use
17a0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3d 25 64 22  sStmtJournal=%d"
17b0: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
17c0: 72 74 20 26 26 20 70 50 61 72 73 65 2d 3e 69 73  rt && pParse->is
17d0: 4d 75 6c 74 69 57 72 69 74 65 29 29 3b 0a 20 20  MultiWrite));.  
17e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
17f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1800: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 66 6f 72  LTABLE.      for
1810: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
1820: 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  nVtabLock; i++){
1830: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
1840: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1850: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1860: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1870: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1890: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
18a0: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
18b0: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
18c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
18d0: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
18e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
18f0: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1900: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1910: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1920: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1930: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
1940: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
1950: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
1960: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
1970: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
1980: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
1990: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
19a0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
19b0: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
19c0: 73 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  s(pParse);..    
19d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19e0: 61 6e 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  any AUTOINCREMEN
19f0: 54 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  T data structure
1a00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
1a10: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1a20: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42  e3AutoincrementB
1a30: 65 67 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20  egin(pParse);.. 
1a40: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e       /* Code con
1a50: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1a60: 73 20 74 68 61 74 20 77 68 65 72 65 20 66 61 63  s that where fac
1a70: 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e  tored out of inn
1a80: 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1a90: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43    if( pParse->pC
1aa0: 6f 6e 73 74 45 78 70 72 20 29 7b 0a 20 20 20 20  onstExpr ){.    
1ab0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1ac0: 4c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  L = pParse->pCon
1ad0: 73 74 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  stExpr;.        
1ae0: 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1af0: 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  actor = 0;.     
1b00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
1b10: 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  L->nExpr; i++){.
1b20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1b40: 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70  , pEL->a[i].pExp
1b50: 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69  r, pEL->a[i].u.i
1b60: 43 6f 6e 73 74 45 78 70 72 52 65 67 29 3b 0a 20  ConstExprReg);. 
1b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b80: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
1b90: 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f  ly, jump back to
1ba0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1bb0: 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  f the executable
1bc0: 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20   code. */.      
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1be0: 76 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, 1);.    }.  }
1bf0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
1c00: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
1c10: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1c20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1c30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1c40: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
1c50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
1c60: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
1c70: 63 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20  cheLevel==0 );  
1c80: 2f 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20  /* Disables and 
1c90: 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68  re-enables match
1ca0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   */.    /* A min
1cb0: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1cc0: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1cd0: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1ce0: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1cf0: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1d00: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1d10: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1d20: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1d30: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1d40: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1d60: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d70: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1da0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1db0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1dc0: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1dd0: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1de0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1df0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1e00: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1e10: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1e20: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1e30: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1e40: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1e50: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1e60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e70: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e80: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e90: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1ea0: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1eb0: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1ec0: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1ed0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ee0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1ef0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1f00: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1f10: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1f20: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1f30: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1f40: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1f50: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1f60: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f70: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f80: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f90: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1fa0: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1fb0: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1fc0: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1fd0: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1fe0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1ff0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
2000: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
2010: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2020: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
2030: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
2040: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2050: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2060: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2070: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2080: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2090: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20a0: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
20b0: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
20c0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
20d0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
20e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20f0: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2100: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
2110: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
2120: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
2130: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
2140: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
2150: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
2160: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2170: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2180: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2190: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
21a0: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
21b0: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
21c0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
21d0: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
21e0: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
21f0: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2200: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
2210: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
2220: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
2230: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
2240: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
2250: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
2260: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2270: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2280: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2290: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
22a0: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
22b0: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
22c0: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
22d0: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
22e0: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
22f0: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2300: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
2310: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2320: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
2330: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
2340: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
2350: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
2360: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2370: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2380: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2390: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
23a0: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
23b0: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
23c0: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
23d0: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
23e0: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
23f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2400: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
2410: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
2420: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
2430: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
2440: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
2450: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2460: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2470: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2480: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2490: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
24a0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
24b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
24c0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
24d0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
24e0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
24f0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2500: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
2510: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
2520: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
2530: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
2540: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
2550: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
2560: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2570: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2580: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2590: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
25a0: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
25b0: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
25c0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
25d0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
25e0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
25f0: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2600: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
2610: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
2620: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2630: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2640: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
2650: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
2660: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2670: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2680: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2690: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
26a0: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
26b0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
26c0: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
26d0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
26e0: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
26f0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2700: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2710: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
2720: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
2730: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
2740: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
2750: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
2760: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2770: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2780: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2790: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
27a0: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
27b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
27c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
27d0: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
27e0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
27f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2800: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2810: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
2820: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2830: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2840: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
2850: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
2860: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2870: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2880: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2890: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
28a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
28b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
28c0: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
28d0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
28e0: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
28f0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2900: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
2910: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
2920: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
2930: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
2940: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
2950: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
2960: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2970: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2980: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2990: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
29a0: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
29b0: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
29c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
29d0: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
29e0: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
29f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2a00: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
2a10: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
2a20: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
2a30: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
2a40: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
2a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a70: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a80: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a90: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2aa0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2ab0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2ac0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2ad0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2ae0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2af0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2b00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2b10: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2b20: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2b30: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2b40: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2b50: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2b60: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b70: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b90: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2ba0: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2bb0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2bc0: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2bd0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2be0: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2bf0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2c00: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2c10: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2c20: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2c40: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2c50: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2c60: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c70: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c90: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2ca0: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2cb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2cc0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2cd0: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2ce0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2d00: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2d10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2d20: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2d30: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2d40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2d50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2d60: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2d70: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2d80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d90: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2da0: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2db0: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2dc0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2dd0: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   */.  if( (db->m
2de0: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
2df0: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d  _SchemaKnownOk)=
2e00: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  =0 .   && SQLITE
2e10: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2e20: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
2e30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2e40: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2e50: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
2e60: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2e70: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2e80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e90: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
2ea0: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
2eb0: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2ec0: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23  o such table";.#
2ed0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ee0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2ef0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
2f00: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
2f10: 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20  base)<1 ){.     
2f20: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2f30: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65  the not the name
2f40: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
2f50: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65  he schema create
2f60: 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  d using.      **
2f70: 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68   CREATE, then ch
2f80: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2f90: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2fa0: 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  an virtual table
2fb0: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
2fc0: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f  an be an eponymo
2fd0: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
2fe0: 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c  . */.      Modul
2ff0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
3000: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
3010: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
3020: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   zName);.      i
3030: 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71  f( pMod==0 && sq
3040: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
3050: 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c  Name, "pragma_",
3060: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   7)==0 ){.      
3070: 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65 33    pMod = sqlite3
3080: 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74  PragmaVtabRegist
3090: 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  er(db, zName);. 
30a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30b0: 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74 65 33   pMod && sqlite3
30c0: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
30d0: 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  leInit(pParse, p
30e0: 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Mod) ){.        
30f0: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70  return pMod->pEp
3100: 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oTab;.      }.  
3110: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
3120: 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f 43 41  f( (flags & LOCA
3130: 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a  TE_NOERR)==0 ){.
3140: 20 20 20 20 20 20 69 66 28 20 7a 44 62 61 73 65        if( zDbase
3150: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3160: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3170: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3180: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3190: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
31a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
31b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
31c0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
31d0: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
31e0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
31f0: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
3200: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
3210: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
3220: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  ** Locate the ta
3230: 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
3240: 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  y *p..**.** This
3250: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
3260: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61  ound sqlite3Loca
3270: 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64  teTable(). The d
3280: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
3290: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61  n.** sqlite3Loca
32a0: 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68  teTable() and th
32b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
32c0: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
32d0: 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74  n restricts.** t
32e0: 68 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68  he search to sch
32f0: 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29  ema (p->pSchema)
3300: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
3310: 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d  LL. p->pSchema m
3320: 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c  ay be.** non-NUL
3330: 4c 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20  L if it is part 
3340: 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69  of a view or tri
3350: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66  gger program def
3360: 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20  inition. See.** 
3370: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
3380: 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  t() for details.
3390: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
33a0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
33b0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
33c0: 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73  se, .  u32 flags
33d0: 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ,.  struct SrcLi
33e0: 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20  st_item *p.){.  
33f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
3400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
3410: 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  chema==0 || p->z
3420: 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20  Database==0 );. 
3430: 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20   if( p->pSchema 
3440: 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
3450: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
3460: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
3470: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
3480: 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d     zDb = pParse-
3490: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
34a0: 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  bSName;.  }else{
34b0: 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44  .    zDb = p->zD
34c0: 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72  atabase;.  }.  r
34d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63  eturn sqlite3Loc
34e0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
34f0: 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65   flags, p->zName
3500: 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , zDb);.}../*.**
3510: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
3520: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
3530: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
3540: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
3550: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
3560: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
3570: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
3580: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3590: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
35a0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
35b0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
35c0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
35d0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
35e0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
35f0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
3600: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
3610: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
3620: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
3630: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
3640: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
3650: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
3660: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
3670: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
3680: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
3690: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
36a0: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
36b0: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
36c0: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
36d0: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
36e0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
36f0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
3700: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
3710: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
3720: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
3730: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
3740: 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ;.  /* All mutex
3750: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
3760: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
3770: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
3780: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
3790: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20   assert( zDb!=0 
37a0: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
37b0: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
37c0: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  b) );.  for(i=OM
37d0: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
37e0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
37f0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
3800: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
3810: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
3820: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
3830: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
3840: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
3850: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
3860: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
3870: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
3880: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
3890: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
38a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
38b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
38c0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
38d0: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
38e0: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
38f0: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3900: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
3910: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
3920: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3930: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
3940: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
3950: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
3960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3970: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
3980: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
3990: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
39a0: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
39b0: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
39c0: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
39d0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
39e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
39f0: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3a00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3a10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
3a20: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73  ->aColExpr);.  s
3a30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3a40: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
3a50: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
3a60: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
3a70: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e  (db, (void *)p->
3a80: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20  azColl);.#ifdef 
3a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3aa0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73  AT3_OR_STAT4.  s
3ab0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
3ac0: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66  iRowEst);.#endif
3ad0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3ae0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
3af0: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
3b00: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
3b10: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
3b20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
3b30: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
3b40: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
3b50: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
3b60: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
3b70: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
3b80: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
3b90: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
3ba0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3bb0: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
3bc0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
3bd0: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3be0: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
3bf0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3c00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
3c10: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
3c20: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
3c30: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3c40: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3c50: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3c60: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3c70: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3c80: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3c90: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
3ca0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3cb0: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3cc0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
3cd0: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
3ce0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3cf0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3d00: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3d10: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3d20: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
3d30: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
3d40: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
3d50: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3d60: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3d70: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3d80: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3d90: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3da0: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3db0: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3dc0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3dd0: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3de0: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3df0: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3e00: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3e10: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3e20: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
3e30: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
3e40: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
3e50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3e60: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
3e70: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
3e80: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46  ;.  }.  db->mDbF
3e90: 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
3ea0: 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a  chemaChange;.}..
3eb0: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75  /*.** Look throu
3ec0: 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f  gh the list of o
3ed0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
3ee0: 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  es in db->aDb[] 
3ef0: 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61  and if.** any ha
3f00: 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20  ve been closed, 
3f10: 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
3f20: 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c   the list.  Real
3f30: 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62  locate the.** db
3f40: 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72  ->aDb[] structur
3f50: 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73  e to a smaller s
3f60: 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ize, if possible
3f70: 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20  ..**.** Entry 0 
3f80: 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61  (the "main" data
3f90: 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20  base) and entry 
3fa0: 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61  1 (the "temp" da
3fb0: 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e  tabase).** are n
3fc0: 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20  ever candidates 
3fd0: 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70  for being collap
3fe0: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
3ff0: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4000: 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65  baseArray(sqlite
4010: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c  3 *db){.  int i,
4020: 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b   j;.  for(i=j=2;
4030: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
4040: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
4050: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
4060: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
4070: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
4080: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4090: 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
40a0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  );.      pDb->zD
40b0: 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  bSName = 0;.    
40c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
40d0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
40e0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
40f0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
4100: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
4110: 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a   }.  db->nDb = j
4120: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
4130: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
4140: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
4150: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
4160: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
4170: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
4180: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
4190: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
41a0: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
41b0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
41c0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
41d0: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
41e0: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
41f0: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
4200: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
4210: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
4220: 6d 61 2e 20 20 54 68 65 20 72 65 73 65 74 20 69  ma.  The reset i
4230: 73 20 64 65 66 65 72 72 65 64 20 69 66 20 64 62  s deferred if db
4240: 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73  ->nSchemaLock is
4250: 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65   not zero..** De
4260: 66 65 72 72 65 64 20 72 65 73 65 74 73 20 6d 61  ferred resets ma
4270: 79 20 62 65 20 72 75 6e 20 62 79 20 63 61 6c 6c  y be run by call
4280: 69 6e 67 20 77 69 74 68 20 69 44 62 3c 30 2e 0a  ing with iDb<0..
4290: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
42a0: 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71  esetOneSchema(sq
42b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
42c0: 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Db){.  int i;.  
42d0: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
42e0: 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 44  nDb );..  if( iD
42f0: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b>=0 ){.    asse
4300: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
4310: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
4320: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 44 62  Db, 0) );.    Db
4330: 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
4340: 69 44 62 2c 20 44 42 5f 52 65 73 65 74 57 61 6e  iDb, DB_ResetWan
4350: 74 65 64 29 3b 0a 20 20 20 20 44 62 53 65 74 50  ted);.    DbSetP
4360: 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20 44  roperty(db, 1, D
4370: 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b 0a  B_ResetWanted);.
4380: 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
4390: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
43a0: 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a  maKnownOk;.  }..
43b0: 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d    if( db->nSchem
43c0: 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  aLock==0 ){.    
43d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
43e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
43f0: 69 66 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  if( DbHasPropert
4400: 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65  y(db, i, DB_Rese
4410: 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20 20 20  tWanted) ){.    
4420: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4430: 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 69  aClear(db->aDb[i
4440: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ].pSchema);.    
4450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4460: 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
4470: 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
4480: 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74  ion from all att
4490: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
44a0: 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d  (including.** "m
44b0: 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29  ain" and "temp")
44c0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
44d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
44e0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
44f0: 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
4500: 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71  sOfConnection(sq
4510: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
4520: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
4530: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
4540: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
4550: 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 3b  SchemaLock==0 );
4560: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
4570: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4580: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
4590: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
45a0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pDb->pSchema ){.
45b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
45c0: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
45d0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
45e0: 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  }.  db->mDbFlags
45f0: 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63 68   &= ~(DBFLAG_Sch
4600: 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c 41 47  emaChange|DBFLAG
4610: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b  _SchemaKnownOk);
4620: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
4630: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
4640: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
4650: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
4660: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4670: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a  aseArray(db);.}.
4680: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4690: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
46a0: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
46b0: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
46c0: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
46d0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
46e0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d 44 62   *db){.  db->mDb
46f0: 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47  Flags &= ~DBFLAG
4700: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
4710: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d  ../*.** Delete m
4720: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
4730: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
4740: 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ames of a table 
4750: 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20  or view (the.** 
4760: 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72  Table.aCol[] arr
4770: 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ay)..*/.void sql
4780: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4790: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
47a0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
47b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
47c0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
47d0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
47e0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
47f0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
4800: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4810: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
4820: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
4830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4840: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
4850: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
4860: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4870: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
4880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4890: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43  ree(db, pCol->zC
48a0: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oll);.    }.    
48b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
48c0: 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  , pTable->aCol);
48d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
48e0: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
48f0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
4900: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4910: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
4920: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
4930: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
4940: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
4950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4960: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
4970: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
4980: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
4990: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
49a0: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
49b0: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
49c0: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
49d0: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
49e0: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
49f0: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
4a00: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
4a10: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
4a20: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
4a30: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62  le..**.** The db
4a40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70   parameter is op
4a50: 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e  tional.  It is n
4a60: 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62  eeded if the Tab
4a70: 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  le object .** co
4a80: 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65  ntains lookaside
4a90: 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65   memory.  (Table
4aa0: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
4ab0: 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73  schema do not us
4ac0: 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  e.** lookaside m
4ad0: 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20  emory, but some 
4ae0: 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  ephemeral Table 
4af0: 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72  objects do.)  Or
4b00: 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d   the.** db param
4b10: 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64  eter can be used
4b20: 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65   with db->pnByte
4b30: 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72  sFreed to measur
4b40: 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e the memory.** 
4b50: 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c  used by the Tabl
4b60: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  e object..*/.sta
4b70: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
4b80: 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65 54  NOINLINE deleteT
4b90: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4ba0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4bb0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
4bc0: 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69 66 64  x, *pNext;..#ifd
4bd0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4be0: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4bf0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4c00: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4c10: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4c20: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4c30: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4c40: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4c50: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4c60: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4c70: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4c80: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4c90: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4ca0: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e 74 20  hange. */.  int 
4cb0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30 3b 0a  nLookaside = 0;.
4cc0: 20 20 69 66 28 20 64 62 20 26 26 20 28 70 54 61    if( db && (pTa
4cd0: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
4ce0: 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
4cf0: 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61 73 69   ){.    nLookasi
4d00: 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 6f 6b  de = sqlite3Look
4d10: 61 73 69 64 65 55 73 65 64 28 64 62 2c 20 30 29  asideUsed(db, 0)
4d20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
4d30: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
4d40: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
4d50: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
4d60: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65  . */.  for(pInde
4d70: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
4d80: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
4d90: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
4da0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
4db0: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
4dc0: 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  ( pIndex->pSchem
4dd0: 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  a==pTable->pSche
4de0: 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ma.         || (
4df0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
4e00: 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 64 78  ) && pIndex->idx
4e10: 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
4e20: 54 59 50 45 5f 41 50 50 44 45 46 29 20 29 3b 0a  TYPE_APPDEF) );.
4e30: 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30 20 7c      if( (db==0 |
4e40: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4e50: 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56 69 72  ed==0) && !IsVir
4e60: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 7b 0a  tual(pTable) ){.
4e70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4e80: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4e90: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4ea0: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4eb0: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4ec0: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4ed0: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4ee0: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
4ef0: 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  e, 0.      );.  
4f00: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4f10: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4f20: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4f30: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4f40: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4f50: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4f60: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4f70: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4f80: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4f90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4fa0: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4fb0: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4fc0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4fd0: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4fe0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4ff0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
5000: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
5010: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
5020: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
5030: 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65  Names(db, pTable
5040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
5050: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
5060: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
5070: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
5080: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  e->zColAff);.  s
5090: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
50a0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
50b0: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
50c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
50d0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
50e0: 65 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eck);.#ifndef SQ
50f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
5100: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
5110: 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54  VtabClear(db, pT
5120: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  able);.#endif.  
5130: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5140: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
5150: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
5160: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
5170: 20 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68   was used by sch
5180: 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ema tables */.  
5190: 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69  assert( nLookasi
51a0: 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73  de==0 || nLookas
51b0: 69 64 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b  ide==sqlite3Look
51c0: 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29 20  asideUsed(db,0) 
51d0: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
51e0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
51f0: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
5200: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44  *pTable){.  /* D
5210: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
5220: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
5230: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5240: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
5250: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
5260: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5270: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
5280: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5290: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62   (--pTable->nTab
52a0: 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e  Ref)>0) ) return
52b0: 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28  ;.  deleteTable(
52c0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
52d0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
52e0: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
52f0: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
5300: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
5310: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
5320: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
5330: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
5340: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
5350: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
5360: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
5370: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
5380: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5390: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
53a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44  .  Table *p;.  D
53b0: 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
53c0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
53d0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
53e0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
53f0: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
5400: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
5410: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
5420: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
5430: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
5440: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
5450: 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67  );  /* Zero-leng
5460: 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61  th table names a
5470: 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  re allowed */.  
5480: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
5490: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
54a0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
54b0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
54c0: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30  ash, zTabName, 0
54d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
54e0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
54f0: 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
5500: 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
5510: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5520: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
5530: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
5540: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
5550: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
5560: 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63  .** token.  Spac
5570: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
5580: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5590: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
55a0: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
55b0: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
55c0: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
55d0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
55e0: 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69  *.** Any quotati
55f0: 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22  on marks (ex:  "
5600: 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b  name", 'name', [
5610: 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60  name], or `name`
5620: 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75  ) that.** surrou
5630: 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  nd the body of t
5640: 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d  he token are rem
5650: 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  oved..**.** Toke
5660: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
5670: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
5680: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
5690: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
56a0: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
56b0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
56c0: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
56d0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
56e0: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
56f0: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
5700: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
5710: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
5720: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
5730: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
5740: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
5750: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
5760: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
5770: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
5780: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
5790: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
57a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
57b0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
57c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
57d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
57e0: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
57f0: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
5800: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
5810: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
5820: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
5830: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
5840: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
5850: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
5860: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5870: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
5880: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
5890: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
58a0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
58b0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
58c0: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
58d0: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d  ASTER_ROOT, 1, M
58e0: 41 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73  ASTER_NAME);.  s
58f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5900: 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Int(v, OP_OpenWr
5910: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
5920: 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20  OOT, iDb, 5);.  
5930: 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29  if( p->nTab==0 )
5940: 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20  {.    p->nTab = 
5950: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
5960: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
5970: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
5980: 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65  terminated buffe
5990: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
59a0: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61   name.** of a da
59b0: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
59c0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
59d0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
59e0: 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66  d db). This.** f
59f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5a00: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5a10: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5a20: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
5a30: 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61  .** -1 if the na
5a40: 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65  med db cannot be
5a50: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
5a60: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5a70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
5a80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5a90: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
5aa0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5ab0: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5ac0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
5ad0: 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f   Db *pDb;.    fo
5ae0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
5af0: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
5b00: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
5b10: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  --){.      if( 0
5b20: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5b30: 70 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c  p(pDb->zDbSName,
5b40: 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b   zName) ) break;
5b50: 0a 20 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22  .      /* "main"
5b60: 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63   is always an ac
5b70: 63 65 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66  ceptable alias f
5b80: 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 64  or the primary d
5b90: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
5ba0: 20 65 76 65 6e 20 69 66 20 69 74 20 68 61 73 20   even if it has 
5bb0: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69  been renamed usi
5bc0: 6e 67 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ng SQLITE_DBCONF
5bd0: 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a  IG_MAINDBNAME. *
5be0: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30  /.      if( i==0
5bf0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
5c00: 74 72 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a  tricmp("main", z
5c10: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5c30: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n i;.}../*.** Th
5c40: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
5c50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
5c60: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
5c70: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
5c80: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
5c90: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
5ca0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
5cb0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
5cc0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
5cd0: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
5ce0: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
5cf0: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
5d00: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
5d10: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
5d20: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
5d30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5d40: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
5d50: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5d80: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
5d90: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73  /* Name we are s
5dc0: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
5dd0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
5de0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
5df0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d  b, pName);.  i =
5e00: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
5e10: 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  me(db, zName);. 
5e20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5e30: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
5e40: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn i;.}../* The
5e50: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f   table or view o
5e60: 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69  r trigger name i
5e70: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
5e80: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
5e90: 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  ens.** pName1 an
5ea0: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5eb0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5ec0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5ed0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   for example:.**
5ee0: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
5ef0: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5f00: 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  ** .** Then pNam
5f10: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
5f20: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
5f30: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
5f40: 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65  r hand if.** the
5f50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5f60: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5f70: 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20  ed, i.e.:.**.** 
5f80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
5f90: 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  (...);.**.** The
5fa0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5fb0: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
5fc0: 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a  me2 is ""..**.**
5fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5fe0: 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c  ts the *ppUnqual
5ff0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
6000: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
6010: 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61  pName1 or.** pNa
6020: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
6030: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
6040: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
6050: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
6060: 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22  * database "xxx"
6070: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6080: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50  .int sqlite3TwoP
6090: 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  artName(.  Parse
60a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
60b0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
60c0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
60d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
60e0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f   *pName1,      /
60f0: 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74  * The "xxx" in t
6100: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6110: 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20  " or "xxx" */.  
6120: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
6130: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
6140: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
6150: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
6160: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
6170: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
6180: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
6190: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
61a0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
61c0: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
61d0: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
61e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
61f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61  pParse->db;..  a
6200: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
6210: 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32   );.  if( pName2
6220: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
6230: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
6240: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6250: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6260: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
6270: 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  se");.      retu
6280: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
6290: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
62a0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
62b0: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
62c0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
62d0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
62e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
62f0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
6300: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
6310: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65  Name1);.      re
6320: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6340: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
6350: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
6360: 62 75 73 79 0a 20 20 20 20 20 20 20 20 20 20 20  busy.           
6370: 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61    || (db->mDbFla
6380: 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75  gs & DBFLAG_Vacu
6390: 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62  um)!=0);.    iDb
63a0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
63b0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
63c0: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
63d0: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
63e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
63f0: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
6400: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
6410: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
6420: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
6430: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
6440: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
6450: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
6460: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
6470: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
6480: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
6490: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
64a0: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
64b0: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
64c0: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
64d0: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
64e0: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
64f0: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
6500: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
6510: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
6520: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
6530: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
6540: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
6550: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
6560: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
6570: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
6580: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
6590: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
65a0: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
65b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
65c0: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
65d0: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
65e0: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
65f0: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
6600: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6610: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6620: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
6630: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
6640: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
6650: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
6660: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6670: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6680: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6690: 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52  eturn the PRIMAR
66a0: 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61  Y KEY index of a
66b0: 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20   table.*/.Index 
66c0: 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  *sqlite3PrimaryK
66d0: 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  eyIndex(Table *p
66e0: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
66f0: 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e  ;.  for(p=pTab->
6700: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73  pIndex; p && !Is
6710: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
6720: 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  p); p=p->pNext){
6730: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
6740: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6750: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  e column of inde
6760: 78 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72  x pIdx that corr
6770: 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65  esponds to table
6780: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e  .** column iCol.
6790: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e    Return -1 if n
67a0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36  ot found..*/.i16
67b0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
67c0: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
67d0: 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20  x, i16 iCol){.  
67e0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
67f0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
6800: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6810: 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43   iCol==pIdx->aiC
6820: 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72  olumn[i] ) retur
6830: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
6840: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n -1;.}../*.** B
6850: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
6860: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
6870: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
6880: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
6890: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
68a0: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
68b0: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
68c0: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
68d0: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
68e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
68f0: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
6900: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
6910: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
6920: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
6930: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
6940: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
6950: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6960: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
6970: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
6980: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
6990: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
69a0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
69b0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
69c0: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
69d0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
69e0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
69f0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
6a00: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
6a10: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
6a20: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
6a30: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
6a40: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
6a50: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
6a60: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
6a70: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
6a80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
6a90: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
6aa0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
6ab0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
6ac0: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
6ad0: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
6ae0: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
6af0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
6b00: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
6b10: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
6b20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
6b30: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6b40: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
6b50: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
6b60: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
6b70: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
6b80: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
6b90: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6ba0: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
6bb0: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
6bc0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
6bd0: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
6be0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
6bf0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
6c00: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
6c10: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
6c20: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
6c30: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
6c40: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
6c50: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6c60: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6c70: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
6c80: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
6c90: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
6ca0: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
6cb0: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
6cc0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6cd0: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
6ce0: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
6cf0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6d00: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
6d10: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
6d20: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
6d30: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
6d40: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
6d50: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
6d60: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
6d70: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
6d80: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
6d90: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
6da0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6db0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
6dc0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
6dd0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
6de0: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
6df0: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
6e00: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
6e10: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
6e20: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6e30: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
6e40: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
6e50: 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74  busy && db->init
6e60: 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20  .newTnum==1 ){. 
6e70: 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61     /* Special ca
6e80: 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65  se:  Parsing the
6e90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f   sqlite_master o
6ea0: 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  r sqlite_temp_ma
6eb0: 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20  ster schema */. 
6ec0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
6ed0: 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65  t.iDb;.    zName
6ee0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
6ef0: 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41  up(db, SCHEMA_TA
6f00: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70  BLE(iDb));.    p
6f10: 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  Name = pName1;. 
6f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6f30: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
6f40: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
6f50: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
6f60: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
6f70: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
6f80: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
6f90: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
6fa0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6fb0: 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32  isTemp && pName2
6fc0: 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20  ->n>0 && iDb!=1 
6fd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63  ){.      /* If c
6fe0: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
6ff0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
7000: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
7010: 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20  ied. Unless .   
7020: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
7030: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
7040: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
7050: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7060: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d  Msg(pParse, "tem
7070: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  porary table nam
7080: 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c  e must be unqual
7090: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72  ified");.      r
70a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
70b0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
70c0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
70d0: 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65  b = 1;.    zName
70e0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
70f0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
7100: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  e);.  }.  pParse
7110: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
7120: 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61  pName;.  if( zNa
7130: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
7140: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7150: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
7160: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
7170: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
7180: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7190: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
71a0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
71b0: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
71c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
71d0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
71e0: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
71f0: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
7200: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
7210: 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65  View==0 || isVie
7220: 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20  w==1 );.  {.    
7230: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
7240: 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCode[] = {.    
7250: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
7260: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7270: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7280: 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  P_TABLE,.       
7290: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
72a0: 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  EW,.       SQLIT
72b0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
72c0: 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  EW.    };.    ch
72d0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
72e0: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
72f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7300: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7310: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
7320: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
7330: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
7340: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
7350: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7360: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7370: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
7380: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7390: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
73a0: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
73b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
73e0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
73f0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7400: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7410: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7420: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
7430: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
7440: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
7450: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
7460: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
7470: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
7480: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
7490: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
74a0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
74b0: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
74c0: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
74d0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
74e0: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
74f0: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7500: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
7510: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
7520: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
7530: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
7540: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
7550: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
7560: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
7570: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
7580: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
7590: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
75a0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
75b0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
75c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
75d0: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
75e0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
75f0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
7600: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
7610: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7620: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7630: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7640: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
7650: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
7660: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
7670: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
7680: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7690: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
76a0: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
76b0: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
76c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
76d0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
76e0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
76f0: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
7700: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7710: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
7720: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
7730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
7740: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7750: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7760: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
7770: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
7780: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7790: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
77a0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
77b0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
77c0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
77d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
77e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
77f0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7800: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
7810: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7820: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
7830: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
7840: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
7850: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
7860: 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73  led );.    pPars
7870: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7880: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70  OMEM_BKPT;.    p
7890: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
78a0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
78b0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
78c0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
78d0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
78e0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
78f0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
7900: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
7910: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
7920: 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23  ->nTabRef = 1;.#
7930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
7940: 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54  AULT_ROWEST.  pT
7950: 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
7960: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
7970: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
7980: 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20  ROWEST);.#else. 
7990: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
79a0: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
79b0: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
79c0: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
79d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
79e0: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
79f0: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
7a00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
7a10: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
7a20: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
7a30: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
7a40: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
7a50: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
7a60: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
7a70: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
7a80: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
7a90: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
7aa0: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
7ab0: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
7ac0: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
7ad0: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
7ae0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7af0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7b00: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
7b10: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
7b20: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7b30: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7b40: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7b50: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
7b60: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
7b70: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
7b80: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
7b90: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
7ba0: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
7bb0: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
7bc0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
7bd0: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
7be0: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
7bf0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7c00: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
7c10: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
7c20: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7c30: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
7c40: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
7c50: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7c60: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
7c70: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
7c80: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
7c90: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
7ca0: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
7cb0: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
7cc0: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
7cd0: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
7ce0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
7cf0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
7d00: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
7d10: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
7d20: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
7d30: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7d40: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
7d50: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
7d60: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
7d70: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
7d80: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
7d90: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
7da0: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20    int addr1;.   
7db0: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
7dc0: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
7dd0: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f  eg2, reg3;.    /
7de0: 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61  * nullRow[] is a
7df0: 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f  n OP_Record enco
7e00: 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f  ding of a row co
7e10: 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73  ntaining 5 NULLs
7e20: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
7e30: 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f  onst char nullRo
7e40: 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c  w[] = { 6, 0, 0,
7e50: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
7e60: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
7e70: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7e80: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
7e90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ea0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7eb0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
7ec0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7ed0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7ee0: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7ef0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7f00: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7f10: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7f20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7f30: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7f40: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7f50: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7f60: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7f70: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7f80: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7f90: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7fa0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7fb0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7fc0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7fd0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7fe0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7ff0: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
8000: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
8010: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
8020: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
8030: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
8040: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
8050: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
8060: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
8070: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8080: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
8090: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
80a0: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
80b0: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
80c0: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
80d0: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
80e0: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
80f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8100: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
8110: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
8120: 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b  AT, fileFormat);
8130: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8140: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
8150: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
8160: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
8170: 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20  , ENC(db));.    
8180: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8190: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
81a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
81b0: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
81c0: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
81d0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
81e0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
81f0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
8200: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
8210: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
8220: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
8230: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
8240: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
8250: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
8260: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
8270: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
8280: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
8290: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
82a0: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
82b0: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
82c0: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
82d0: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
82e0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
82f0: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
8300: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
8310: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
8320: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
8330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
8340: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
8350: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
8360: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
8370: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
8380: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
8390: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
83a0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
83b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
83c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
83d0: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
83e0: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
83f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8400: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8410: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
8420: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
8430: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70  if.    {.      p
8440: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
8450: 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   =.         sqli
8460: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8470: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c   OP_CreateBtree,
8480: 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45   iDb, reg2, BTRE
8490: 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d  E_INTKEY);.    }
84a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
84b0: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
84c0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
84d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
84e0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
84f0: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
8500: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8510: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72  v, OP_Blob, 6, r
8520: 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c  eg3, 0, nullRow,
8530: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
8540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8550: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8560: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
8570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8580: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8590: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
85a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
85b0: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
85c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
85d0: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
85e0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
85f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8600: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8610: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
8620: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
8630: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8640: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
8650: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70  urn;.}../* Set p
8660: 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74  roperties of a t
8670: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65  able column base
8680: 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61  d on the (magica
8690: 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  l).** name of th
86a0: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66  e column..*/.#if
86b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48   SQLITE_ENABLE_H
86c0: 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f  IDDEN_COLUMNS.vo
86d0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
86e0: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
86f0: 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  me(Table *pTab, 
8700: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20  Column *pCol){. 
8710: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
8720: 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  nicmp(pCol->zNam
8730: 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c  e, "__hidden__",
8740: 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70   10)==0 ){.    p
8750: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
8760: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b   COLFLAG_HIDDEN;
8770: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
8780: 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d  b && pCol!=pTab-
8790: 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d  >aCol && (pCol[-
87a0: 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  1].colFlags & CO
87b0: 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b  LFLAG_HIDDEN) ){
87c0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
87d0: 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64  ags |= TF_OOOHid
87e0: 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  den;.  }.}.#endi
87f0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8800: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
8810: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8820: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
8830: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8840: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8850: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8860: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8870: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8880: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8890: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
88a0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
88b0: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
88c0: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
88d0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
88e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
88f0: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8900: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
8910: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8920: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
8930: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8940: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
8950: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8960: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8970: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8980: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8990: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
89a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
89b0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
89c0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
89d0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43  urn;.  if( p->nC
89e0: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
89f0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8a00: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
8a10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8a20: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
8a30: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
8a40: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
8a50: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  urn;.  }.  z = s
8a60: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
8a70: 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b  w(db, pName->n +
8a80: 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a   pType->n + 2);.
8a90: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
8aa0: 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  urn;.  memcpy(z,
8ab0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
8ac0: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d  ->n);.  z[pName-
8ad0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
8ae0: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
8af0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8b00: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
8b10: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
8b20: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
8b30: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
8b40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8b50: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
8b60: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
8b70: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
8b80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8b90: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
8ba0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
8bb0: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
8bc0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
8bd0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
8be0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
8bf0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
8c00: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
8c10: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
8c20: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
8c30: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
8c40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8c50: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
8c60: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
8c70: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
8c80: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
8c90: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
8ca0: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
8cb0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
8cc0: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
8cd0: 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33  e = z;.  sqlite3
8ce0: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
8cf0: 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c  FromName(p, pCol
8d00: 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65  );. .  if( pType
8d10: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
8d20: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
8d30: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
8d40: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
8d50: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
8d60: 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20  y.    ** 'BLOB' 
8d70: 77 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 73  with a default s
8d80: 69 7a 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20  ize of 4 bytes. 
8d90: 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  */.    pCol->aff
8da0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
8db0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
8dc0: 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69  l->szEst = 1;.#i
8dd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8de0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
8df0: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d  NCES.    if( 4>=
8e00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
8e10: 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20  fig.szSorterRef 
8e20: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63  ){.      pCol->c
8e30: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
8e40: 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20  AG_SORTERREF;.  
8e50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
8e60: 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  se{.    zType = 
8e70: 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  z + sqlite3Strle
8e80: 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20  n30(z) + 1;.    
8e90: 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54  memcpy(zType, pT
8ea0: 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e  ype->z, pType->n
8eb0: 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79  );.    zType[pTy
8ec0: 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  pe->n] = 0;.    
8ed0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
8ee0: 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  Type);.    pCol-
8ef0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8f00: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8f10: 7a 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20  zType, pCol);.  
8f20: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
8f30: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
8f40: 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  YPE;.  }.  p->nC
8f50: 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ol++;.  pParse->
8f60: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
8f70: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
8f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8f90: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8fa0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8fb0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8fc0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8fd0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8fe0: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
8ff0: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
9000: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
9010: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
9020: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
9030: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
9040: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
9050: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9060: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
9070: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
9080: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
9090: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
90a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
90b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70  olumn *pCol;.  p
90c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
90d0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
90e0: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
90f0: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
9100: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
9110: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70  [p->nCol-1];.  p
9120: 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  Col->notNull = (
9130: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d  u8)onError;.  p-
9140: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
9150: 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f  HasNotNull;..  /
9160: 2a 20 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f  * Set the uniqNo
9170: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e  tNull flag on an
9180: 79 20 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69  y UNIQUE or PK i
9190: 6e 64 65 78 65 73 20 61 6c 72 65 61 64 79 20 63  ndexes already c
91a0: 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  reated.  ** on t
91b0: 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a  his column.  */.
91c0: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46    if( pCol->colF
91d0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55  lags & COLFLAG_U
91e0: 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64  NIQUE ){.    Ind
91f0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
9200: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
9210: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9220: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9230: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9240: 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64  KeyCol==1 && pId
9250: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
9260: 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  one );.      if(
9270: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9280: 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b  0]==p->nCol-1 ){
9290: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75  .        pIdx->u
92a0: 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  niqNotNull = 1;.
92b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  }.}../*.** Scan 
92d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
92e0: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
92f0: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
9300: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
9310: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
9320: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
9330: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
9340: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
9350: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
9360: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
9370: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
9380: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
9390: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
93a0: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
93b0: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
93c0: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
93d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
93e0: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
93f0: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
9400: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9410: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
9420: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
9430: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
9440: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
9450: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
9460: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
9470: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
9480: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
9490: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
94a0: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
94b0: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94d0: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
94e0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
94f0: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
9500: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
9510: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
9520: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
9530: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
9540: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
9550: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9560: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
9570: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9580: 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c  FF_BLOB.** 'REAL
9590: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
95a0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
95b0: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
95c0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
95d0: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
95e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
95f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
9600: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
9610: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
9620: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
9630: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
9640: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
9650: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
9660: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
9670: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43  nst char *zIn, C
9680: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20  olumn *pCol){.  
9690: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
96a0: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
96b0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
96c0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
96d0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
96e0: 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c  zIn!=0 );.  whil
96f0: 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20  e( zIn[0] ){.   
9700: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
9710: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
9720: 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a  r[(*zIn)&0xff];.
9730: 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69      zIn++;.    i
9740: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
9750: 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('h'<<16)+('a'<
9760: 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20  <8)+'r') ){     
9770: 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20          /* CHAR 
9780: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9790: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
97a0: 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49        zChar = zI
97b0: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
97c0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
97d0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
97e0: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
97f0: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
9800: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9810: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9820: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
9830: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
9840: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
9850: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
9860: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9870: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9880: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9890: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
98a0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
98b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
98c0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
98d0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
98e0: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
98f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
9900: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
9910: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
9920: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b  ;.      if( zIn[
9930: 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20  0]=='(' ) zChar 
9940: 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53  = zIn;.#ifndef S
9950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
9960: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
9970: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
9980: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
9990: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
99a0: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
99b0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
99c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
99d0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
99e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
99f0: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
9a00: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
9a10: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9a20: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
9a30: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
9a40: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9a50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9a60: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9a70: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9a80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9a90: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
9aa0: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
9ab0: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
9ac0: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
9ad0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9ae0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9af0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9b00: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
9b10: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
9b20: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
9b30: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
9b40: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
9b50: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
9b60: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9b70: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
9b80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9b90: 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73  .  /* If pCol is
9ba0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65   not NULL, store
9bb0: 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
9bc0: 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20  the field size. 
9bd0: 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61   The.  ** estima
9be0: 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20  te is scaled so 
9bf0: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
9c00: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31   an integer is 1
9c10: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
9c20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20   ){.    int v = 
9c30: 30 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  0;   /* default 
9c40: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
9c50: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
9c60: 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46  ( aff<SQLITE_AFF
9c70: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9c80: 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20    if( zChar ){. 
9c90: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43         while( zC
9ca0: 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  har[0] ){.      
9cb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
9cc0: 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29  sdigit(zChar[0])
9cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9ce0: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
9cf0: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
9d00: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9d20: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61  te3GetInt32(zCha
9d30: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
9d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9d60: 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20   zChar++;.      
9d70: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9d80: 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b  .        v = 16;
9d90: 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54     /* BLOB, TEXT
9da0: 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28  , CLOB -> r=5  (
9db0: 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29  approx 20 bytes)
9dc0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
9dd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9de0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
9df0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
9e00: 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  v>=sqlite3Global
9e10: 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52  Config.szSorterR
9e20: 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ef ){.      pCol
9e30: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
9e40: 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b  LFLAG_SORTERREF;
9e50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9e60: 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20    v = v/4 + 1;. 
9e70: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
9e80: 20 3d 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c   = 255;.    pCol
9e90: 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d  ->szEst = v;.  }
9ea0: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
9eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
9ec0: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
9ed0: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
9ee0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9ef0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
9f00: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
9f10: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9f20: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
9f30: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
9f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
9f50: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
9f60: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
9f70: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
9f80: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
9f90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9fa0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
9fb0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
9fc0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
9fd0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
9fe0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9ff0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
a000: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
a010: 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70  alue(.  Parse *p
a020: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
a030: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a040: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
a050: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
a060: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
a070: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
a080: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
a090: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
a0a0: 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a  *zStart,      /*
a0b0: 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 64 65   Start of the de
a0c0: 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74  fault value text
a0d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
a0e0: 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f   *zEnd         /
a0f0: 2a 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65  * First characte
a100: 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65  r past end of de
a110: 66 61 75 74 20 76 61 6c 75 65 20 74 65 78 74 20  faut value text 
a120: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
a130: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
a140: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
a150: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a160: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
a170: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
a180: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
a190: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
a1a0: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
a1b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a1c0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
a1d0: 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e  pExpr, db->init.
a1e0: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
a1f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a200: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
a210: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
a220: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
a230: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
a240: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
a250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a260: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78  /* A copy of pEx
a270: 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  pr is used inste
a280: 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ad of the origin
a290: 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e  al, as pExpr con
a2a0: 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
a2b0: 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74  okens that point
a2c0: 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d   to volatile mem
a2d0: 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ory..      */.  
a2e0: 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20      Expr x;.    
a2f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a300: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
a310: 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  flt);.      mems
a320: 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&x, 0, sizeof
a330: 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70  (x));.      x.op
a340: 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20   = TK_SPAN;.    
a350: 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73    x.u.zToken = s
a360: 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28  qlite3DbSpanDup(
a370: 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64  db, zStart, zEnd
a380: 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74  );.      x.pLeft
a390: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
a3a0: 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69  x.flags = EP_Ski
a3b0: 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  p;.      pCol->p
a3c0: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
a3d0: 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58  prDup(db, &x, EX
a3e0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
a3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
a400: 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65  ee(db, x.u.zToke
a410: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
a420: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
a430: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
a440: 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73  ./*.** Backwards
a450: 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48   Compatibility H
a460: 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74  ack:.** .** Hist
a470: 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20  orical versions 
a480: 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70 74  of SQLite accept
a490: 65 64 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f  ed strings as co
a4a0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a  lumn names in.**
a4b0: 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49   indexes and PRI
a4c0: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
a4d0: 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51  ints and in UNIQ
a4e0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  UE constraints. 
a4f0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
a500: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a510: 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50   xyz(a,b,c,d,e,P
a520: 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c  RIMARY KEY('a'),
a530: 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20 43  UNIQUE('b','c' C
a540: 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20  OLLATE trim).** 
a550: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
a560: 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c   abc ON xyz('c',
a570: 27 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c  'd' DESC,'e' COL
a580: 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43  LATE nocase DESC
a590: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  );.**.** This is
a5a0: 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20   goofy.  But to 
a5b0: 70 72 65 73 65 72 76 65 20 62 61 63 6b 77 61 72  preserve backwar
a5c0: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
a5d0: 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a   we continue to.
a5e0: 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20 54  ** accept it.  T
a5f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
a600: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63   the necessary c
a610: 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63  onversion.  It c
a620: 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65  onverts.** the e
a630: 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20  xpression given 
a640: 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  in its argument 
a650: 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47  from a TK_STRING
a660: 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a   into a TK_ID.**
a670: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a680: 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f  on is just a TK_
a690: 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f  STRING with an o
a6a0: 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20  ptional COLLATE 
a6b0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68  clause..** If th
a6c0: 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73 20  e epxression is 
a6d0: 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
a6e0: 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74  han TK_STRING, t
a6f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a700: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  .** unchanged..*
a710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
a720: 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
a730: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
a740: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  p->op==TK_STRING
a750: 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20   ){.    p->op = 
a760: 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TK_ID;.  }else i
a770: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
a780: 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74  LATE && p->pLeft
a790: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
a7a0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d  ){.    p->pLeft-
a7b0: 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d  >op = TK_ID;.  }
a7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
a7d0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
a7e0: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
a7f0: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
a800: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
a810: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
a820: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
a830: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
a840: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
a850: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
a860: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
a870: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
a880: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a890: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
a8a0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
a8b0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
a8c0: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
a8d0: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
a8e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
a8f0: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
a900: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
a910: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
a920: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
a930: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
a940: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
a950: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
a960: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
a970: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
a980: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
a990: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
a9a0: 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74  he rowid.  Set t
a9b0: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
a9c0: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
a9d0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
a9e0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
a9f0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
aa00: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
aa10: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
aa20: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
aa30: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
aa40: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
aa50: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
aa60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
aa70: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
aa80: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
aa90: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
aaa0: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
aab0: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
aac0: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
aad0: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
aae0: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
aaf0: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
ab00: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
ab10: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
ab20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ab30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
ab40: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ab50: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
ab60: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
ab70: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
ab80: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
ab90: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
aba0: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
abb0: 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20  nt autoInc,     
abc0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
abd0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
abe0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
abf0: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
ac00: 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  der     /* SQLIT
ac10: 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49  E_SO_ASC or SQLI
ac20: 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b  TE_SO_DESC */.){
ac30: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
ac40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ac50: 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  le;.  Column *pC
ac60: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
ac70: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e  ol = -1, i;.  in
ac80: 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70  t nTerm;.  if( p
ac90: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72  Tab==0 ) goto pr
aca0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
acb0: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
acc0: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
acd0: 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73  maryKey ){.    s
ace0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
acf0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
ad00: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
ad10: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
ad20: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
ad30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
ad40: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
ad50: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
ad60: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
ad70: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20  HasPrimaryKey;. 
ad80: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
ad90: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
ada0: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->nCol - 1;.    
adb0: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
adc0: 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70 43  ol[iCol];.    pC
add0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
ade0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
adf0: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a  .    nTerm = 1;.
ae00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65    }else{.    nTe
ae10: 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rm = pList->nExp
ae20: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
ae30: 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nTerm; i++){. 
ae40: 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70       Expr *pCExp
ae50: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
ae60: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
ae70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
ae80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45       assert( pCE
ae90: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
aea0: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
aeb0: 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20  d(pCExpr);.     
aec0: 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d   if( pCExpr->op=
aed0: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
aee0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
aef0: 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75  Name = pCExpr->u
af00: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
af10: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
af20: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
af30: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
af40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
af50: 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62  Cmp(zCName, pTab
af60: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
af70: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
af80: 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
af90: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
afb0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
afc0: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20  LFLAG_PRIMKEY;. 
afd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
afe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
aff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b000: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b010: 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 70  nTerm==1.   && p
b020: 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Col.   && sqlite
b030: 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65 33  3StrICmp(sqlite3
b040: 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c  ColumnType(pCol,
b050: 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ""), "INTEGER")=
b060: 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64  =0.   && sortOrd
b070: 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45  er!=SQLITE_SO_DE
b080: 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62  SC.  ){.    pTab
b090: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
b0a0: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
b0b0: 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  f = (u8)onError;
b0c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74  .    assert( aut
b0d0: 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49  oInc==0 || autoI
b0e0: 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  nc==1 );.    pTa
b0f0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61  b->tabFlags |= a
b100: 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e  utoInc*TF_Autoin
b110: 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28  crement;.    if(
b120: 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d   pList ) pParse-
b130: 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20  >iPkSortOrder = 
b140: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
b150: 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69  Order;.  }else i
b160: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
b170: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b180: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
b190: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b1a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
b1b0: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
b1c0: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
b1d0: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
b1e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
b1f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
b200: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
b210: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
b220: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
b230: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20   onError, 0,.   
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f          0, sortO
b260: 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f  rder, 0, SQLITE_
b270: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
b280: 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  EY);.    pList =
b290: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
b2a0: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
b2b0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
b2c0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
b2d0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
b2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
b2f0: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
b300: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
b310: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
b320: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
b330: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
b340: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
b350: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
b360: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
b370: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
b380: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
b390: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
b3a0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
b3b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b3c0: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
b3d0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
b3e0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71  >pNewTable;.  sq
b3f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b400: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54  se->db;.  if( pT
b410: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
b420: 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71  E_VTAB.   && !sq
b430: 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
b440: 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d  only(db->aDb[db-
b450: 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a  >init.iDb].pBt).
b460: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70    ){.    pTab->p
b470: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
b480: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
b490: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
b4a0: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
b4b0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
b4c0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
b4d0: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
b4e0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
b4f0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
b500: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
b510: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
b520: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
b530: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
b540: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
b550: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
b560: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
b570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
b580: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
b590: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
b5a0: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
b5b0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
b5c0: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
b5d0: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
b5e0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
b5f0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
b600: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
b610: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
b620: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
b630: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
b640: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
b650: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
b660: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
b670: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
b680: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
b690: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
b6a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
b6b0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
b6c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b6d0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
b6e0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
b6f0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
b700: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
b710: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
b720: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
b730: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
b740: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
b750: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b760: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e(db, p->aCol[i]
b770: 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  .zColl);.    p->
b780: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
b790: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
b7a0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
b7b0: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
b7c0: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
b7d0: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
b7e0: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
b7f0: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
b800: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
b810: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
b820: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
b830: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
b840: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
b850: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
b860: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
b870: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
b880: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
b890: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
b8a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b8b0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
b8c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
b8d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
b8e0: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
b8f0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
b900: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
b910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
b930: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
b940: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
b950: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b960: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
b970: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b980: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
b990: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
b9a0: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
b9b0: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
b9c0: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
b9d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
b9e0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
b9f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
ba00: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
ba10: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
ba20: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
ba30: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
ba40: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
ba50: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
ba60: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
ba70: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
ba80: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
ba90: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
baa0: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
bab0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
bac0: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
bad0: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
bae0: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
baf0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
bb00: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
bb10: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
bb20: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
bb30: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
bb40: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
bb50: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
bb60: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
bb70: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
bb80: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
bb90: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
bba0: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
bbb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bbc0: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
bbd0: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
bbe0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
bbf0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
bc00: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
bc10: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
bc20: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
bc30: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
bc40: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
bc50: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
bc60: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
bc70: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
bc80: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
bc90: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
bca0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
bcb0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
bcc0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
bcd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
bce0: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
bcf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bd00: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
bd10: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
bd20: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
bd30: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
bd40: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
bd50: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
bd60: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
bd70: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
bd80: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
bd90: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
bda0: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
bdb0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
bdc0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
bdd0: 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20  se, enc, pColl, 
bde0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  zName);.  }..  r
bdf0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
be00: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
be10: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
be20: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
be30: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
be40: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
be50: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
be60: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
be70: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
be80: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
be90: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
bea0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
beb0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
bec0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
bed0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
bee0: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
bef0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
bf00: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
bf10: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
bf20: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
bf30: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
bf40: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
bf50: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
bf60: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
bf70: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
bf80: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
bf90: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
bfa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
bfb0: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
bfc0: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
bfd0: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
bfe0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
bff0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
c000: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
c010: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
c020: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
c030: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
c040: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
c050: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
c060: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
c070: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
c080: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
c090: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
c0a0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
c0b0: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
c0c0: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
c0d0: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
c0e0: 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d  ION-OF: R-34230-
c0f0: 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75 74  56049 SQLite aut
c100: 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65  omatically incre
c110: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68  ments.** the sch
c120: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e  ema-version when
c130: 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61 20  ever the schema 
c140: 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  changes..*/.void
c150: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
c160: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
c170: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
c180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c190: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
c1a0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c1b0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
c1c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
c1d0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
c1e0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
c1f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
c200: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
c210: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
c220: 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ION, .          
c230: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 31           (int)(1
c240: 2b 28 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61  +(unsigned)db->a
c250: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
c260: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29  >schema_cookie))
c270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
c280: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
c290: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
c2a0: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
c2b0: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
c2c0: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
c2d0: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
c2e0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
c2f0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
c300: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
c310: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
c320: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
c330: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
c340: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
c350: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
c360: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
c370: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
c380: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
c390: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
c3a0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
c3b0: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
c3c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
c3d0: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
c3e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
c3f0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
c400: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
c410: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c420: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
c430: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
c440: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
c450: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
c460: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
c470: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
c480: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
c490: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
c4a0: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
c4b0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
c4c0: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
c4d0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
c4e0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
c4f0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
c500: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
c510: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
c520: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
c530: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
c540: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
c550: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
c560: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
c570: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
c580: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
c590: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
c5a0: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
c5b0: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
c5c0: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
c5d0: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
c5e0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
c5f0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
c600: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
c610: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
c620: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
c630: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
c640: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
c650: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
c660: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
c670: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
c680: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
c690: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
c6a0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
c6b0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
c6c0: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
c6d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c6e0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
c6f0: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
c700: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
c710: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
c720: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
c730: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
c740: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
c750: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
c760: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
c770: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
c780: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
c790: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
c7a0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
c7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c7c0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
c7d0: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
c7e0: 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  K_ID.           
c7f0: 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   || zIdent[j]!=0
c800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c810: 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65  j==0;..  if( nee
c820: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
c830: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
c840: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
c850: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
c860: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
c870: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
c880: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
c890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
c8a0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c8b0: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
c8c0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
c8d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c8e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
c8f0: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
c900: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
c910: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
c920: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
c930: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
c940: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
c950: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
c960: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
c970: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
c980: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c990: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c9a0: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
c9b0: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
c9c0: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
c9d0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
c9e0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
c9f0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
ca00: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
ca10: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
ca20: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
ca30: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
ca40: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
ca50: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
ca60: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
ca70: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
ca80: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
ca90: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
caa0: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
cab0: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
cac0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
cad0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
cae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
caf0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
cb00: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
cb10: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
cb20: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
cb30: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
cb40: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
cb50: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
cb60: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
cb70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
cb80: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
cb90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
cba0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
cbb0: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
cbc0: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
cbd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cbe0: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
cbf0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
cc00: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
cc10: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
cc20: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
cc30: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
cc40: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
cc50: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
cc60: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
cc70: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
cc80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
cc90: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
cca0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
ccb0: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
ccc0: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
ccd0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
cce0: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
ccf0: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
cd00: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
cd10: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
cd20: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
cd30: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
cd40: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
cd50: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
cd60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
cd70: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
cd80: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
cd90: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
cda0: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
cdb0: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
cdc0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
cdd0: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
cde0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
cdf0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
ce00: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
ce10: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
ce20: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
ce30: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
ce40: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
ce50: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
ce60: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
ce70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
ce80: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
ce90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
cea0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
ceb0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cec0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
ced0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cee0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cef0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
cf00: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
cf10: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
cf20: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
cf30: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
cf40: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
cf50: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
cf60: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
cf70: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
cf80: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
cf90: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
cfa0: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
cfb0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
cfc0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
cfd0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
cfe0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
cff0: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
d000: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
d010: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
d020: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
d030: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
d040: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
d050: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
d060: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
d070: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
d080: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
d090: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
d0a0: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
d0b0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
d0c0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
d0d0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
d0e0: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
d0f0: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
d100: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
d110: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
d120: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
d130: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
d140: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
d150: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
d160: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
d170: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
d180: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
d190: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
d1a0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
d1b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d1c0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
d1d0: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
d1e0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
d1f0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
d200: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
d210: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
d220: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
d230: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
d240: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
d250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d260: 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70  EM_BKPT;.  memcp
d270: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
d280: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
d290: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
d2a0: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
d2b0: 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
d2c0: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
d2d0: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
d2e0: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
d2f0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
d300: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
d310: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
d320: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
d330: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
d340: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
d350: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
d360: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
d370: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
d380: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
d390: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
d3a0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
d3b0: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
d3c0: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
d3d0: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
d3e0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
d3f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d400: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
d410: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
d420: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
d430: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
d440: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
d450: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
d460: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
d470: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
d480: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
d490: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
d4a0: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
d4b0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
d4c0: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
d4d0: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
d4e0: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
d4f0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
d500: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
d510: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
d520: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
d530: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
d540: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
d550: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
d560: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
d570: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
d580: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
d590: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
d5a0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
d5b0: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
d5c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
d5d0: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
d5e0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
d5f0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
d600: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
d610: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
d620: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
d630: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
d640: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
d650: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
d660: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
d670: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
d680: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
d690: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
d6a0: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
d6b0: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
d6c0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
d6d0: 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73  ue if value x is
d6e0: 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68   found any of th
d6f0: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
d700: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a  ries of aiCol[].
d710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d720: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
d730: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
d740: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
d750: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
d760: 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c  ) if( x==*(aiCol
d770: 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ++) ) return 1;.
d780: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d790: 2a 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20  * Recompute the 
d7a0: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 66 69 65 6c  colNotIdxed fiel
d7b0: 64 20 6f 66 20 74 68 65 20 49 6e 64 65 78 2e 0a  d of the Index..
d7c0: 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65  **.** colNotIdxe
d7d0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  d is a bitmask t
d7e0: 68 61 74 20 68 61 73 20 61 20 30 20 62 69 74 20  hat has a 0 bit 
d7f0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 65 61 63  representing eac
d800: 68 20 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c  h indexed.** col
d810: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 77 69  umns that are wi
d820: 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 36  thin the first 6
d830: 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  3 columns of the
d840: 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20   table.  The.** 
d850: 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f  high-order bit o
d860: 66 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73  f colNotIdxed is
d870: 20 61 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c 20   always 1.  All 
d880: 75 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  unindexed column
d890: 73 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  s.** of the tabl
d8a0: 65 20 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a  e have a 1..**.*
d8b0: 2a 20 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65  * The colNotIdxe
d8c0: 64 20 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64  d mask is AND-ed
d8d0: 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
d8e0: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61  t.a[].colUsed ma
d8f0: 73 6b 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  sk.** to determi
d900: 6e 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ne if the index 
d910: 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  is covering inde
d920: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
d930: 64 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d  d recomputeColum
d940: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64  nsNotIndexed(Ind
d950: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
d960: 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
d970: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
d980: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
d990: 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
d9a0: 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
d9b0: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
d9c0: 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
d9d0: 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
d9e0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
d9f0: 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
da00: 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
da10: 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
da20: 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
da30: 20 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64    pIdx->colNotId
da40: 78 65 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65  xed = ~m;.  asse
da50: 72 74 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f  rt( (pIdx->colNo
da60: 74 49 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29  tIdxed>>63)==1 )
da70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
da80: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20  routine runs at 
da90: 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69  the end of parsi
daa0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
dab0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
dac0: 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55  .** has a WITHOU
dad0: 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20  T ROWID clause. 
dae0: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
daf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63   routine is to c
db00: 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69  onvert both.** i
db10: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
db20: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
db30: 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  nd the generated
db40: 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68   VDBE code so th
db50: 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61  at they.** are a
db60: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61  ppropriate for a
db70: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
db80: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
db90: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a  a rowid table..*
dba0: 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64  * Changes includ
dbb0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
dbc0: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
dbd0: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
dbe0: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
dbf0: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
dc00: 4c 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43  L..**     (2)  C
dc10: 6f 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d 65  onvert P3 parame
dc20: 74 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72  ter of the OP_Cr
dc30: 65 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42  eateBtree from B
dc40: 54 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20  TREE_INTKEY .** 
dc50: 20 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54           into BT
dc60: 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20  REE_BLOBKEY..** 
dc70: 20 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20      (3)  Bypass 
dc80: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
dc90: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
dca0: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a  r table entry.**
dcb0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68            for th
dcc0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73  e PRIMARY KEY as
dcd0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
dce0: 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a   index is now.**
dcf0: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
dd00: 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  fied by the sqli
dd10: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
dd20: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
dd30: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20  le itself..**   
dd40: 20 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49    (4)  Set the I
dd50: 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65  ndex.tnum of the
dd60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
dd70: 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ex object in the
dd80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68  .**          sch
dd90: 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70  ema to the rootp
dda0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  age from the mai
ddb0: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  n table..**     
ddc0: 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62  (5)  Add all tab
ddd0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
dde0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
ddf0: 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20  dex object.**   
de00: 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74         so that t
de10: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
de20: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
de30: 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73  ex.  The surplus
de40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .**          col
de50: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
de60: 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65   KeyInfo.nAllFie
de70: 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75  ld and are not u
de80: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  sed for.**      
de90: 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c      sorting or l
dea0: 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e  ookup or uniquen
deb0: 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20  ess checks..**  
dec0: 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20     (6)  Replace 
ded0: 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f  the rowid tail o
dee0: 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61  n all automatica
def0: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e  lly generated UN
df00: 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  IQUE.**         
df10: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68   indices with th
df20: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
df30: 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  lumns..**.** For
df40: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c   virtual tables,
df50: 20 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72   only (1) is per
df60: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
df70: 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f  c void convertTo
df80: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
df90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
dfa0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
dfb0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
dfc0: 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e  Index *pPk;.  in
dfd0: 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20  t nPk;.  int i, 
dfe0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
dff0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e000: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
e010: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20  e->pVdbe;..  /* 
e020: 4d 61 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41  Mark every PRIMA
e030: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73  RY KEY column as
e040: 20 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70   NOT NULL (excep
e050: 74 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74  t for imposter t
e060: 61 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66  ables).  */.  if
e070: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f  ( !db->init.impo
e080: 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20  sterTable ){.   
e090: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
e0a0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
e0b0: 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61      if( (pTab->a
e0c0: 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20  Col[i].colFlags 
e0d0: 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
e0e0: 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
e0f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e   pTab->aCol[i].n
e100: 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72  otNull = OE_Abor
e110: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
e120: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e130: 65 6d 61 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f  emaining transfo
e140: 72 6d 61 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70  rmations only ap
e150: 70 6c 79 20 74 6f 20 62 2d 74 72 65 65 20 74 61  ply to b-tree ta
e160: 62 6c 65 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a  bles, not to.  *
e170: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * virtual tables
e180: 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 44 45 43   */.  if( IN_DEC
e190: 4c 41 52 45 5f 56 54 41 42 20 29 20 72 65 74 75  LARE_VTAB ) retu
e1a0: 72 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72  rn;..  /* Conver
e1b0: 74 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64  t the P3 operand
e1c0: 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74   of the OP_Creat
e1d0: 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72  eBtree opcode fr
e1e0: 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a  om BTREE_INTKEY.
e1f0: 20 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f    ** into BTREE_
e200: 42 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  BLOBKEY..  */.  
e210: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72  if( pParse->addr
e220: 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  CrTab ){.    ass
e230: 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71  ert( v );.    sq
e240: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e250: 33 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  3(v, pParse->add
e260: 72 43 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c  rCrTab, BTREE_BL
e270: 4f 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  OBKEY);.  }..  /
e280: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49  * Locate the PRI
e290: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
e2a0: 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62   Or, if this tab
e2b0: 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  le was originall
e2c0: 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45  y.  ** an INTEGE
e2d0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61  R PRIMARY KEY ta
e2e0: 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65  ble, create a ne
e2f0: 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  w PRIMARY KEY in
e300: 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  dex. .  */.  if(
e310: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
e320: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
e330: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65  *pList;.    Toke
e340: 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20  n ipkToken;.    
e350: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
e360: 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62  (&ipkToken, pTab
e370: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
e380: 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
e390: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
e3a0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
e3b0: 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  arse, 0, .      
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e3d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
e3e0: 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65   TK_ID, &ipkToke
e3f0: 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  n, 0));.    if( 
e400: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
e410: 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  n;.    pList->a[
e420: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  0].sortOrder = p
e430: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
e440: 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  der;.    assert(
e450: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e460: 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
e470: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
e480: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
e490: 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d   0, pList, pTab-
e4a0: 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20  >keyConf, 0, 0, 
e4b0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e4d0: 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
e4e0: 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28  ARYKEY);.    if(
e4f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e500: 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
e510: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  r ) return;.    
e520: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
e530: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
e540: 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  b);.    pTab->iP
e550: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
e560: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
e570: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
e580: 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20  dex(pTab);..    
e590: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  /*.    ** Remove
e5a0: 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63   all redundant c
e5b0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
e5c0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
e5d0: 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67  r example, chang
e5e0: 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52  e.    ** "PRIMAR
e5f0: 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c  Y KEY(a,b,a,b,c,
e600: 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73  b,c,d)" into jus
e610: 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  t "PRIMARY KEY(a
e620: 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72  ,b,c,d)".  Later
e630: 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73  .    ** code ass
e640: 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  umes the PRIMARY
e650: 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   KEY contains no
e660: 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e   repeated column
e670: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
e680: 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e  r(i=j=1; i<pPk->
e690: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
e6a0: 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
e6b0: 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  mn(pPk->aiColumn
e6c0: 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  , j, pPk->aiColu
e6d0: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e6e0: 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d    pPk->nColumn--
e6f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e700: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
e710: 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d  lumn[j++] = pPk-
e720: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e740: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a  pPk->nKeyCol = j
e750: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e760: 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d  pPk!=0 );.  pPk-
e770: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
e780: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
e790: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
e7a0: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
e7b0: 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70  l = 1;.  nPk = p
e7c0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20  Pk->nKeyCol;..  
e7d0: 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72  /* Bypass the cr
e7e0: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52  eation of the PR
e7f0: 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20  IMARY KEY btree 
e800: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  and the sqlite_m
e810: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
e820: 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20   entry. This is 
e830: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66  only required if
e840: 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72   currently gener
e850: 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20  ating VDBE.  ** 
e860: 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54  code for a CREAT
e870: 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65  E TABLE (not whe
e880: 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73  n parsing one as
e890: 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67   part of reading
e8a0: 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65  .  ** a database
e8b0: 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20   schema).  */.  
e8c0: 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e  if( v && pPk->tn
e8d0: 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  um>0 ){.    asse
e8e0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  rt( db->init.bus
e8f0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  y==0 );.    sqli
e900: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
e910: 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d  ode(v, pPk->tnum
e920: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a  , OP_Goto);.  }.
e930: 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70  .  /* The root p
e940: 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41  age of the PRIMA
e950: 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61  RY KEY is the ta
e960: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f  ble root page */
e970: 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70  .  pPk->tnum = p
e980: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a  Tab->tnum;..  /*
e990: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
e9a0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
e9b0: 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51  tion of all UNIQ
e9c0: 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f  UE indices by co
e9d0: 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68  nverting.  ** th
e9e0: 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f  e final rowid co
e9f0: 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72  lumn into one or
ea00: 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66   more columns of
ea10: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ea20: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
ea30: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
ea40: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
ea50: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
ea60: 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72   n;.    if( IsPr
ea70: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
ea80: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
ea90: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69      for(i=n=0; i
eaa0: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
eab0: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
eac0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
ead0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
eae0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
eaf0: 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) n++;.    }. 
eb00: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
eb10: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
eb20: 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ex is a superset
eb30: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
eb40: 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64  key */.      pId
eb50: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64  x->nColumn = pId
eb60: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
eb70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
eb80: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  }.    if( resize
eb90: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
eba0: 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
ebb0: 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b  Col+n) ) return;
ebc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
ebd0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
ebe0: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
ebf0: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
ec00: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
ec10: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
ec20: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
ec30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  ) ){.        pId
ec40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  x->aiColumn[j] =
ec50: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
ec60: 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ];.        pIdx-
ec70: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b  >azColl[j] = pPk
ec80: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
ec90: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
eca0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
ecb0: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
ecc0: 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n>=pIdx->nKeyCol
ecd0: 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +n );.    assert
ece0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
ecf0: 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =j );.  }..  /* 
ed00: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
ed10: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
ed20: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
ed30: 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54   */.  if( nPk<pT
ed40: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
ed50: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
ed60: 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70  bject(db, pPk, p
ed70: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74  Tab->nCol) ) ret
ed80: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
ed90: 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d  , j=nPk; i<pTab-
eda0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
edb0: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
edc0: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
edd0: 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20   j, i) ){.      
ede0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d    assert( j<pPk-
edf0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
ee00: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
ee10: 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[j] = i;.      
ee20: 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d    pPk->azColl[j]
ee30: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
ee40: 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  ARY;.        j++
ee50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ee60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
ee70: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20  >nColumn==j );. 
ee80: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
ee90: 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65  >nCol==j );.  }e
eea0: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43  lse{.    pPk->nC
eeb0: 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43  olumn = pTab->nC
eec0: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d 70  ol;.  }.  recomp
eed0: 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64  uteColumnsNotInd
eee0: 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 2f 2a  exed(pPk);.}../*
eef0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ef00: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
ef10: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
ef20: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
ef30: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
ef40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
ef50: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
ef60: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
ef70: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
ef80: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
ef90: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
efa0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
efb0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
efc0: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
efd0: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
efe0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
eff0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
f000: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
f010: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
f020: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
f030: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
f040: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
f050: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
f060: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
f070: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
f080: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
f090: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
f0a0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
f0b0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
f0c0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
f0d0: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
f0e0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
f0f0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
f100: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
f110: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
f120: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
f130: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
f140: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
f150: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
f160: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
f170: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
f180: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
f190: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
f1a0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
f1b0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
f1c0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
f1d0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
f1e0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
f1f0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
f200: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
f210: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
f220: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
f230: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
f240: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
f250: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
f260: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
f270: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
f280: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
f290: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f2a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
f2b0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
f2c0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
f2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f2e0: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
f2f0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
f300: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
f310: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
f320: 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65     /* The ')' be
f330: 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20  fore options in 
f340: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
f350: 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73   */.  u8 tabOpts
f360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f370: 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74   Extra table opt
f380: 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e  ions. Usually 0.
f390: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
f3a0: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
f3b0: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
f3c0: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
f3d0: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
f3e0: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
f3f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
f400: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
f410: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
f420: 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
f430: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f440: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  on */.  int iDb;
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
f470: 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65   which the table
f480: 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65   lives */.  Inde
f490: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
f4a0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c        /* An impl
f4b0: 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  ied index of the
f4c0: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28   table */..  if(
f4d0: 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c   pEnd==0 && pSel
f4e0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ect==0 ){.    re
f4f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
f500: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
f510: 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70  ailed );.  p = p
f520: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
f530: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
f540: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
f550: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
f560: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
f570: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
f580: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
f590: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
f5a0: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
f5b0: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
f5c0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
f5d0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
f5e0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
f5f0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
f600: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
f610: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
f620: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
f630: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
f640: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
f650: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
f660: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
f670: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
f680: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
f690: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20  outine.).  **.  
f6a0: 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
f6b0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c  age number is 1,
f6c0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
f6d0: 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   is the sqlite_m
f6e0: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
f6f0: 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72   itself.  So mar
f700: 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  k it read-only..
f710: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
f720: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
f730: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
f740: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f750: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22 29  rMsg(pParse, "")
f760: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
f770: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
f780: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
f790: 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  Tnum;.    if( p-
f7a0: 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61  >tnum==1 ) p->ta
f7b0: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61  bFlags |= TF_Rea
f7c0: 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  donly;.  }..  /*
f7d0: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
f7e0: 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
f7f0: 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
f800: 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
f810: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
f820: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
f830: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
f840: 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
f850: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f860: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f870: 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
f880: 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
f890: 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
f8a0: 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
f8b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f8c0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
f8d0: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
f8e0: 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
f8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f900: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
f910: 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
f920: 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
f930: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
f940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
f950: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
f960: 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
f970: 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
f980: 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f  .      convertTo
f990: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
f9a0: 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
f9b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d    }.  }..  iDb =
f9c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f9d0: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
f9e0: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
f9f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
fa00: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
fa10: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
fa20: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
fa30: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
fa40: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
fa50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
fa60: 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
fa70: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f  e(pParse, p, NC_
fa80: 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70  IsCheck, 0, p->p
fa90: 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64  Check);.  }.#end
faa0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
fab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
fac0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) */..  /* Estim
fad0: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
fae0: 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65  row size for the
faf0: 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
fb00: 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63  ll implied indic
fb10: 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65  es */.  estimate
fb20: 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20  TableWidth(p);. 
fb30: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
fb40: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
fb50: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
fb60: 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57    estimateIndexW
fb70: 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a  idth(pIdx);.  }.
fb80: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
fb90: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
fba0: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
fbb0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
fbc0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
fbd0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
fbe0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
fbf0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
fc00: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
fc10: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
fc20: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
fc30: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
fc40: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
fc50: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
fc60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
fc70: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
fc80: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
fc90: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
fca0: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
fcb0: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
fcc0: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
fcd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
fce0: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
fcf0: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
fd00: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
fd10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
fd20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
fd30: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
fd40: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
fd50: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fd60: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
fd70: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
fd80: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
fd90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fda0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
fdb0: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
fdc0: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
fdd0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
fde0: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
fdf0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
fe00: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
fe10: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
fe20: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
fe30: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
fe40: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
fe50: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
fe60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
fe70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe80: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
fe90: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
fea0: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
feb0: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
fec0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
fed0: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
fee0: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
fef0: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
ff00: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
ff10: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
ff20: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
ff30: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
ff40: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
ff50: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
ff60: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
ff70: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
ff80: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
ff90: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
ffa0: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
ffb0: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
ffc0: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
ffd0: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
ffe0: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
fff0: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
10000 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
10010 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
10020 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
10030 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
10040 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
10050 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
10060 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
10070 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
10080 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
10090 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
100a0 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
100b0 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
100c0 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
100d0 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
100e0 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
100f0 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
10100 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
10110 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
10120 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
10130 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
10140 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
10150 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
10160 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57  st dest;    /* W
10170 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  here the SELECT 
10180 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73  should store res
10190 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
101a0 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20  t regYield;     
101b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
101c0 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65  lding co-routine
101d0 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a   entry-point */.
101e0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
101f0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  p;        /* Top
10200 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
10210 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
10220 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
10230 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62  /* A record to b
10240 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  e insert into th
10250 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
10260 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
10270 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  d;       /* Rowi
10280 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f  d of the next ro
10290 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  w to insert */. 
102a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73       int addrIns
102b0 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20  Loop;    /* Top 
102c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
102d0 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a  inserting rows *
102e0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
102f0 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41  SelTab;     /* A
10300 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63   table that desc
10310 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54  ribes the SELECT
10320 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20   results */..   
10330 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b     regYield = ++
10340 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10350 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70      regRec = ++p
10360 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10370 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
10380 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10390 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
103a0 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
103b0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
103c0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
103d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
103e0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
103f0 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
10400 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
10410 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10420 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
10430 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20  AG_P2ISREG);.   
10440 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
10450 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = 2;.      addrT
10460 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10470 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
10480 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
10490 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
104a0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
104b0 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64   regYield, 0, ad
104c0 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 69 66  drTop);.      if
104d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
104e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70   return;.      p
104f0 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
10500 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10510 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
10520 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
10530 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
10540 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
10550 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
10560 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
10570 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
10580 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
10590 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
105a0 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
105b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
105c0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
105d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
105e0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
105f0 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Tab);.      sqli
10600 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
10610 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
10620 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
10630 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10640 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10650 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
10660 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
10670 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
10680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10690 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
106a0 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
106b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
106c0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
106d0 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61 64  p - 1);.      ad
106e0 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69  drInsLoop = sqli
106f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10700 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
10710 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
10720 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10740 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
10750 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e  akeRecord, dest.
10760 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73  iSdst, dest.nSds
10770 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  t, regRec);.    
10780 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66    sqlite3TableAf
10790 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b  finity(v, p, 0);
107a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
107b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
107c0 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52  ewRowid, 1, regR
107d0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
107e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
107f0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20  , OP_Insert, 1, 
10800 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64  regRec, regRowid
10810 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10820 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
10830 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
10840 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10850 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
10860 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
10870 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10880 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
10890 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
108a0 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
108b0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
108c0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
108d0 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
108e0 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
108f0 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
10900 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
10910 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
10920 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
10930 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
10940 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
10950 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
10960 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
10970 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
10980 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
10990 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
109a0 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
109b0 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
109c0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
109d0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
109e0 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
109f0 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
10a00 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
10a10 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
10a20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
10a30 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
10a40 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
10a50 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
10a60 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
10a70 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
10a80 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
10a90 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
10aa0 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
10ab0 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
10ac0 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
10ad0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
10ae0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10af0 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
10b00 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
10b10 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
10b20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
10b30 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
10b40 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
10b50 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
10b60 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
10b70 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
10b80 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
10b90 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
10ba0 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
10bb0 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
10bc0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
10bd0 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
10be0 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
10bf0 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
10c00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10c10 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
10c20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
10c30 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
10c40 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
10c50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
10c60 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
10c70 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
10c80 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
10c90 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
10ca0 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
10cb0 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
10cc0 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
10cd0 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
10ce0 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
10cf0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
10d00 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20  crement)!=0 ){. 
10d10 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
10d20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
10d30 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10d40 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
10d50 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
10d60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
10d70 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
10d80 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
10d90 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10da0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10db0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
10dc0 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
10dd0 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
10de0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
10df0 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20  >zDbSName.      
10e00 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
10e10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
10e20 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
10e30 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
10e40 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
10e50 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
10e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10e70 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
10e80 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
10e90 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
10ea0 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
10eb0 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74  %q' AND type!='t
10ec0 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61  rigger'", p->zNa
10ed0 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  me));.  }...  /*
10ee0 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
10ef0 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
10f00 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
10f10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
10f20 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
10f30 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
10f40 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
10f50 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
10f60 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20   = p->pSchema;. 
10f70 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10f80 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
10f90 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
10fa0 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
10fb0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
10fc0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
10fd0 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20   p->zName, p);. 
10fe0 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
10ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
11000 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
11010 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
11020 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
11030 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
11040 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
11050 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
11060 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rn;.    }.    pP
11070 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
11080 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62  = 0;.    db->mDb
11090 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
110a0 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23  SchemaChange;..#
110b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
110c0 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
110d0 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
110e0 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
110f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
11100 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
11110 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
11120 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
11130 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
11140 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
11150 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
11160 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
11170 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
11180 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
11190 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
111a0 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
111b0 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
111c0 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
111d0 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
111e0 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
111f0 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
11200 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
11210 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
11220 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11230 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
11240 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
11250 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
11260 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
11270 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
11280 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
11290 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
112a0 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
112b0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
112c0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
112d0 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
112e0 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
112f0 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
11300 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
11310 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
11320 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
11330 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
11340 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
11350 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
11360 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
11370 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
11380 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
11390 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
113a0 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f  CNames, /* Optio
113b0 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77  nal list of view
113c0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
113d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
113e0 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
113f0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
11400 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
11410 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
11420 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
11430 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
11440 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
11450 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
11460 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
11470 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
11480 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
11490 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
114a0 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
114b0 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
114c0 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
114d0 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
114e0 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
114f0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62  e = 0;.  int iDb
11500 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
11510 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
11520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
11530 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
11540 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11550 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
11560 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
11570 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67  n views");.    g
11580 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11590 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  fail;.  }.  sqli
115a0 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
115b0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
115c0 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
115d0 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
115e0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
115f0 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
11600 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
11610 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
11620 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74  ew_fail;.  sqlit
11630 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
11640 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11650 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
11660 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11670 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11680 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  p->pSchema);.  s
11690 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
116a0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
116b0 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
116c0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
116d0 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
116e0 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20  pSelect) ) goto 
116f0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11700 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  ;..  /* Make a c
11710 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
11720 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11730 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
11740 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
11750 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
11760 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
11770 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
11780 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
11790 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
117a0 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
117b0 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
117c0 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
117d0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
117e0 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
117f0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
11800 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
11810 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
11820 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
11830 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
11840 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
11850 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
11860 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  p->pCheck = sqli
11870 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
11880 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52  b, pCNames, EXPR
11890 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69  DUP_REDUCE);.  i
118a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
118b0 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74  led ) goto creat
118c0 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
118d0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
118e0 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
118f0 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
11900 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
11910 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
11920 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
11930 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
11940 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45  en;.  assert( sE
11950 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45  nd.z[0]!=0 || sE
11960 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nd.n==0 );.  if(
11970 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
11980 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
11990 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
119a0 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
119b0 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20   (int)(sEnd.z - 
119c0 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73  pBegin->z);.  as
119d0 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a  sert( n>0 );.  z
119e0 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   = pBegin->z;.  
119f0 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
11a00 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b  space(z[n-1]) ){
11a10 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
11a20 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
11a30 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
11a40 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
11a50 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
11a60 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
11a70 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
11a80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
11a90 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
11aa0 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a   &sEnd, 0, 0);..
11ab0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11ac0 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  :.  sqlite3Selec
11ad0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
11ae0 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ect);.  sqlite3E
11af0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
11b00 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65  , pCNames);.  re
11b10 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11b20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11b30 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
11b40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11b50 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
11b60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
11b70 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
11b80 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
11b90 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
11ba0 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
11bb0 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
11bc0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
11bd0 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
11be0 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
11bf0 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
11c00 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
11c10 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
11c20 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
11c30 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
11c40 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
11c50 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
11c60 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
11c70 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
11c80 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
11c90 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
11ca0 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
11cb0 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
11cc0 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
11cd0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11ce0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
11cf0 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
11d00 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
11d10 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
11d20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
11d30 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
11d40 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
11d50 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
11d60 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
11d70 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
11d80 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
11d90 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
11da0 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
11db0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11dc0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
11dd0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
11de0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
11df0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11e00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11e10 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65  BLE.  int rc;.#e
11e20 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
11e30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
11e40 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  ZATION.  sqlite3
11e50 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
11e60 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
11e70 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65  th pointer */.#e
11e80 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
11e90 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
11ea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11eb0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62  IRTUALTABLE.  db
11ec0 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b  ->nSchemaLock++;
11ed0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
11ee0 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
11ef0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
11f00 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63    db->nSchemaLoc
11f10 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  k--;.  if( rc ){
11f20 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
11f30 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
11f40 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
11f50 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
11f60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11f70 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
11f80 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
11f90 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
11fa0 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
11fb0 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
11fc0 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
11fd0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
11fe0 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
11ff0 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
12000 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
12010 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
12020 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
12030 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
12040 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
12050 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
12060 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
12070 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
12080 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
12090 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
120a0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
120b0 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
120c0 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
120d0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
120e0 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
120f0 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
12100 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
12110 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
12120 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
12130 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
12140 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65   the error above
12150 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
12160 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
12170 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
12180 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77  * But the follow
12190 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c  ing test is stil
121a0 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69  l important as i
121b0 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20  t does come up. 
121c0 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   ** in the follo
121d0 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  wing:.  ** .  **
121e0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
121f0 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20  E main.ex1(a);. 
12200 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
12210 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20  EMP VIEW ex1 AS 
12220 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78  SELECT a FROM ex
12230 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  1;.  **     SELE
12240 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65  CT * FROM temp.e
12250 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x1;.  */.  if( p
12260 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
12270 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12280 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
12290 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
122a0 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
122b0 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
122c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
122d0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
122e0 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
122f0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
12300 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
12310 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
12320 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
12330 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
12340 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
12350 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
12360 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
12370 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
12380 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
12390 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
123a0 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
123b0 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
123c0 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
123d0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
123e0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
123f0 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
12400 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
12410 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
12420 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
12430 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
12440 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
12450 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
12460 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
12470 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
12480 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
12490 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
124a0 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
124b0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
124c0 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  able->pSelect, 0
124d0 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
124e0 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  .    n = pParse-
124f0 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74  >nTab;.    sqlit
12500 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
12510 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
12520 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  Sel->pSrc);.    
12530 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
12540 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
12550 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b  side.bDisable++;
12560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12570 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
12580 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64  ON.    xAuth = d
12590 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62  b->xAuth;.    db
125a0 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
125b0 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
125c0 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
125d0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
125e0 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
125f0 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
12600 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
12610 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
12620 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12630 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
12640 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
12650 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  n;.    if( pTabl
12660 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  e->pCheck ){.   
12670 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45     /* CREATE VIE
12680 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20  W name(arglist) 
12690 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  AS ....      ** 
126a0 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  The names of the
126b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
126c0 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20  table are taken 
126d0 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72  from.      ** ar
126e0 67 6c 69 73 74 20 77 68 69 63 68 20 69 73 20 73  glist which is s
126f0 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d  tored in pTable-
12700 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43  >pCheck.  The pC
12710 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20  heck field.     
12720 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c   ** normally hol
12730 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ds CHECK constra
12740 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e  ints on an ordin
12750 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66  ary table, but f
12760 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49  or.      ** a VI
12770 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20  EW it holds the 
12780 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  list of column n
12790 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ames..      */. 
127a0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
127b0 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
127c0 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e  pParse, pTable->
127d0 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20  pCheck, .       
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c            &pTabl
12800 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65  e->nCol, &pTable
12810 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  ->aCol);.      i
12820 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
12830 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26  led==0 .       &
12840 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
12850 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62  0.       && pTab
12860 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e  le->nCol==pSel->
12870 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20  pEList->nExpr.  
12880 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
12890 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43  qlite3SelectAddC
128a0 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
128b0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
128c0 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  able, pSel);.   
128d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
128e0 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
128f0 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49      /* CREATE VI
12900 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77  EW name AS...  w
12910 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65  ithout an argume
12920 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72  nt list.  Constr
12930 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  uct.      ** the
12940 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
12950 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  om the SELECT st
12960 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
12970 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
12980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
12990 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
129a0 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
129b0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
129c0 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
129d0 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
129e0 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
129f0 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
12a00 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
12a10 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
12a20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
12a30 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
12a40 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
12a50 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20  Table->pSchema) 
12a60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12a70 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
12a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
12a90 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
12aa0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
12ab0 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
12ac0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
12ad0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29  Delete(db, pSel)
12ae0 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
12af0 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a  ide.bDisable--;.
12b00 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
12b10 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61  Err++;.  }.  pTa
12b20 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  ble->pSchema->sc
12b30 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f  hemaFlags |= DB_
12b40 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
12b50 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12b60 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
12b70 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
12b80 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
12b90 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43  ;.    pTable->aC
12ba0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62  ol = 0;.    pTab
12bb0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
12bc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12bd0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
12be0 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
12bf0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
12c00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12c10 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
12c20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12c30 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
12c40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12c50 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
12c60 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
12c70 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
12c80 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
12c90 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
12ca0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
12cb0 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
12cc0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
12cd0 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
12ce0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12cf0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
12d00 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b  d(db, idx, 0) );
12d10 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
12d20 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
12d30 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
12d40 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
12d50 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
12d60 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
12d70 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
12d80 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
12d90 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
12da0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
12db0 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
12dc0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
12dd0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
12de0 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
12df0 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
12e00 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
12e10 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
12e20 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
12e30 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
12e40 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
12e50 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
12e60 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
12e70 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
12e80 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
12e90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12ea0 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
12eb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12ec0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
12ed0 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
12ee0 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
12ef0 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
12f00 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
12f10 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
12f20 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
12f30 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
12f40 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
12f50 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
12f60 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
12f70 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
12f80 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
12f90 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
12fa0 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
12fb0 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
12fc0 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
12fd0 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
12fe0 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
12ff0 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
13000 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
13010 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
13020 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
13030 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
13040 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
13050 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
13060 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
13070 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
13080 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
13090 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
130a0 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
130b0 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
130c0 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
130d0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
130e0 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
130f0 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
13100 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
13110 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
13120 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
13130 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
13140 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
13150 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
13160 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
13170 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
13180 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
13190 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
131a0 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
131b0 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
131c0 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
131d0 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
131e0 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
131f0 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
13200 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
13210 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
13220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13230 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
13240 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
13250 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20  geMoved(sqlite3 
13260 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
13270 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
13280 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
13290 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
132a0 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  ash;.  Db *pDb;.
132b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
132c0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
132d0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
132e0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
132f0 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20  b[iDb];.  pHash 
13300 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
13310 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
13320 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
13330 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
13340 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
13350 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
13360 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
13370 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
13380 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
13390 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
133a0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
133b0 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
133c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61  .    }.  }.  pHa
133d0 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
133e0 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66  ma->idxHash;.  f
133f0 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
13400 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
13410 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
13420 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
13430 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
13440 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
13450 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
13460 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
13470 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
13480 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
13490 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  To;.    }.  }.}.
134a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
134b0 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
134c0 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
134d0 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
134e0 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
134f0 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
13500 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
13510 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
13520 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
13530 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
13540 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
13550 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
13560 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
13570 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
13580 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
13590 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
135a0 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
135b0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
135c0 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
135d0 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
135e0 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
135f0 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
13600 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
13610 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
13620 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13630 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
13640 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
13650 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  se);.  assert( i
13660 54 61 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c  Table>1 );.  sql
13670 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13680 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
13690 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
136a0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
136b0 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
136c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
136d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
136e0 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
136f0 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
13700 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
13710 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
13720 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
13730 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
13740 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
13750 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
13760 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
13770 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
13780 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
13790 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
137a0 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
137b0 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
137c0 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
137d0 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
137e0 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
137f0 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
13800 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
13810 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
13820 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
13830 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
13840 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
13850 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
13860 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
13870 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
13880 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
13890 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
138a0 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
138b0 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
138c0 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
138d0 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
138e0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
138f0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
13900 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
13910 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
13920 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
13930 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
13940 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
13950 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
13960 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
13970 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
13980 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
13990 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
139a0 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
139b0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
139c0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
139d0 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
139e0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
139f0 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
13a00 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
13a10 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
13a20 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
13a30 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
13a40 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
13a50 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
13a60 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
13a70 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
13a80 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
13a90 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
13aa0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
13ab0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
13ac0 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
13ad0 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
13ae0 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
13af0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
13b00 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
13b10 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
13b20 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
13b30 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
13b40 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
13b50 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
13b60 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
13b70 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
13b80 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
13b90 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
13ba0 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
13bb0 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
13bc0 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
13bd0 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
13be0 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
13bf0 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
13c00 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
13c10 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
13c20 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
13c30 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
13c40 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
13c50 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
13c60 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
13c70 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
13c80 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
13c90 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
13ca0 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
13cb0 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
13cc0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
13cd0 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
13ce0 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
13cf0 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
13d00 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
13d10 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
13d20 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
13d30 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
13d40 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
13d50 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
13d60 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
13d70 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
13d80 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
13d90 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
13da0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
13db0 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
13dc0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
13dd0 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
13de0 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
13df0 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
13e00 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
13e10 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
13e20 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
13e30 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
13e40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
13e50 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
13e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13e70 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
13e80 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
13e90 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
13ea0 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
13eb0 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
13ec0 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
13ed0 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
13ee0 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
13ef0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13f00 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
13f10 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
13f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
13f30 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
13f40 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
13f50 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
13f60 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61  Schema);.      a
13f70 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
13f80 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
13f90 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65  >nDb );.      de
13fa0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
13fb0 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
13fc0 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
13fd0 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
13fe0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
13ff0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74  /*.** Remove ent
14000 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71  ries from the sq
14010 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
14020 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32  s (for N in (1,2
14030 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20  ,3)).** after a 
14040 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52  DROP INDEX or DR
14050 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
14060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14070 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
14080 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65  tTables(.  Parse
14090 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
140a0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
140b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
140c0 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
140d0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
140e0 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
140f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
14100 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22  pe,     /* "idx"
14110 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63   or "tbl" */.  c
14120 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
14130 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14140 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
14150 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
14160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14170 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64  Name = pParse->d
14180 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
14190 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Name;.  for(i=1;
141a0 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=4; i++){.   
141b0 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a   char zTab[24];.
141c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
141d0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62  intf(sizeof(zTab
141e0 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73  ),zTab,"sqlite_s
141f0 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69  tat%d",i);.    i
14200 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
14210 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
14220 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29  zTab, zDbName) )
14230 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
14240 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
14250 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
14260 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
14270 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
14280 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
14290 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  b, zType, zName.
142a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
142b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
142c0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
142d0 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
142e0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
142f0 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
14300 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
14310 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
14320 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
14330 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
14340 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14350 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
14360 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
14370 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
14380 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14390 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
143a0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
143b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
143c0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
143d0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
143e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
143f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14400 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
14410 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
14420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14430 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
14440 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14450 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
14460 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
14470 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
14480 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
14490 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
144a0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
144b0 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
144c0 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
144d0 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
144e0 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
144f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
14500 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
14510 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
14520 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
14530 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
14540 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
14550 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
14560 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
14570 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
14580 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
14590 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
145a0 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
145b0 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
145c0 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
145d0 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
145e0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
145f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14600 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
14610 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
14620 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
14630 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
14640 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
14650 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
14660 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
14670 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
14680 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
14690 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
146a0 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
146b0 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
146c0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
146d0 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
146e0 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
146f0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
14700 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
14710 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
14720 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
14730 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
14740 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
14750 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
14760 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
14770 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
14780 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
14790 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
147a0 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
147b0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c    pDb->zDbSName,
147c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
147d0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
147e0 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
147f0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
14800 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
14810 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
14820 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  o the.  ** table
14830 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
14840 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
14850 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
14860 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
14870 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
14880 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
14890 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
148a0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
148b0 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70  being.  ** dropp
148c0 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
148d0 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
148e0 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
148f0 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a  igger can be.  *
14900 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
14910 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
14920 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
14930 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
14940 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  .  ** database..
14950 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
14960 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
14970 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  , .      "DELETE
14980 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
14990 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
149a0 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
149b0 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  '",.      pDb->z
149c0 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
149d0 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  NAME, pTab->zNam
149e0 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
149f0 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
14a00 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
14a10 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
14a20 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
14a30 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
14a40 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
14a50 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
14a60 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
14a70 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
14a80 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
14a90 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14aa0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
14ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14ac0 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
14ad0 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
14ae0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  zName, 0);.  }. 
14af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b00 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
14b10 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
14b20 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
14b30 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
14b40 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
14b50 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
14b60 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
14b70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
14b80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14b90 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
14ba0 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
14bb0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
14bc0 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
14bd0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
14be0 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
14bf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
14c00 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
14c10 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
14c20 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
14c30 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
14c40 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
14c50 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
14c60 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14c70 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
14c80 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14c90 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
14ca0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14cb0 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
14cc0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
14cd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14ce0 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
14cf0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65  .  if( sqlite3Re
14d00 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
14d10 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
14d20 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e  p_table;.  if( n
14d30 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
14d40 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65  essErr++;.  asse
14d50 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
14d60 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f   isView==LOCATE_
14d70 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d  VIEW );.  pTab =
14d80 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
14d90 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
14da0 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e  isView, &pName->
14db0 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45  a[0]);.  if( noE
14dc0 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14dd0 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70  sErr--;..  if( p
14de0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
14df0 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65  ( noErr ) sqlite
14e00 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
14e10 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
14e20 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
14e30 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  base);.    goto 
14e40 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14e50 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
14e60 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
14e70 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
14e80 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
14e90 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
14ea0 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
14eb0 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
14ec0 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
14ed0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
14ee0 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
14ef0 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
14f00 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
14f10 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14f20 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
14f30 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
14f40 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
14f50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14f60 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
14f70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14f80 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
14f90 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
14fa0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14fb0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
14fc0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
14fd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
14fe0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
14ff0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  DbSName;.    con
15000 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
15010 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
15020 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15030 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
15040 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
15050 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
15060 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15070 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
15080 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
15090 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
150a0 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
150b0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
150c0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
150d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
150e0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
150f0 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
15100 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
15110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15120 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
15130 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
15140 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
15150 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15160 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
15170 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
15180 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
15190 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
151a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
151b0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
151c0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
151d0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
151e0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
151f0 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
15200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15210 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
15220 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
15230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15240 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15250 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
15260 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
15270 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
15280 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15290 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
152a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
152b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
152c0 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
152d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
152e0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
152f0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15300 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
15310 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
15320 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
15330 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
15340 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26  _", 7)==0 .    &
15350 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
15360 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
15370 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31  sqlite_stat", 11
15380 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
15390 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
153a0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
153b0 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
153c0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
153d0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
153e0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
153f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15400 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
15410 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
15420 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
15430 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
15440 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
15450 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
15460 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
15470 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
15480 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
15490 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
154a0 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
154b0 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
154c0 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
154d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
154e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
154f0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
15500 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
15510 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
15520 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15530 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
15540 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
15550 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
15560 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
15570 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15580 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15590 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
155a0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
155b0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
155c0 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
155d0 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
155e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
155f0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15600 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
15610 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
15620 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
15630 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
15640 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
15650 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
15660 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
15670 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b  );.    sqlite3Fk
15680 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
15690 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a  , pName, pTab);.
156a0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44      sqlite3CodeD
156b0 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
156c0 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69   pTab, iDb, isVi
156d0 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ew);.  }..exit_d
156e0 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
156f0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
15700 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
15710 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15720 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
15730 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
15740 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
15750 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
15760 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
15770 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
15780 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
15790 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
157a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
157b0 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
157c0 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
157d0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
157e0 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
157f0 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
15800 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
15810 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
15820 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
15830 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28  le referred to (
15840 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e  a.k.a the "paren
15850 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43  t" table).  pToC
15860 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20  ol is a list.** 
15870 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
15880 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c   parent pTo tabl
15890 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  e.  flags contai
158a0 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
158b0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
158c0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
158d0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
158e0 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
158f0 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
15900 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
15910 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
15920 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
15930 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
15940 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
15950 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
15960 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
15970 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
15980 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15990 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  e field..**.** T
159a0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
159b0 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
159c0 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
159d0 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
159e0 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
159f0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
15a00 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
15a10 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
15a20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15a30 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
15a40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15a50 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
15a60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15a70 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
15a80 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
15a90 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
15aa0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
15ab0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
15ac0 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
15ad0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15ae0 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
15af0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
15b00 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
15b10 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
15b20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
15b30 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
15b40 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
15b50 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
15b60 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  s. */.){.  sqlit
15b70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15b80 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
15b90 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
15ba0 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
15bb0 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a  ey = 0;.  FKey *
15bc0 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65  pNextTo;.  Table
15bd0 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
15be0 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
15bf0 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
15c00 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
15c10 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
15c20 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
15c30 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c   p==0 || IN_DECL
15c40 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
15c50 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
15c60 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
15c70 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
15c80 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e  Col-1;.    if( N
15c90 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67  EVER(iCol<0) ) g
15ca0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15cb0 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
15cc0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
15cd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15ce0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15cf0 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
15d00 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
15d10 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
15d20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
15d30 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
15d40 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
15d50 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
15d60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
15d70 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
15d80 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
15d90 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
15da0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
15db0 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
15dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15dd0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
15de0 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
15df0 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
15e00 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
15e10 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
15e20 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
15e30 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
15e40 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
15e50 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
15e60 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
15e70 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
15e80 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
15e90 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
15ea0 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  Key) + (nCol-1)*
15eb0 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
15ec0 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
15ed0 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
15ee0 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
15ef0 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
15f00 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
15f10 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
15f20 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
15f30 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
15f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
15f50 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
15f60 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
15f70 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
15f80 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  y==0 ){.    goto
15f90 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70   fk_end;.  }.  p
15fa0 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
15fb0 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
15fc0 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
15fd0 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
15fe0 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b  Key->aCol[nCol];
15ff0 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
16000 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
16010 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
16020 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
16030 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
16040 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f  e(z);.  z += pTo
16050 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
16060 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
16070 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
16080 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
16090 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
160a0 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
160b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
160c0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
160d0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
160e0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
160f0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
16100 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
16110 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
16120 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
16130 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
16140 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
16150 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
16160 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
16170 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16190 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
161a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
161b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
161c0 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
161d0 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
161e0 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
161f0 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
16200 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
16210 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
16220 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
16230 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
16240 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
16250 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
16260 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
16270 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
16280 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16290 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
162a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
162b0 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
162c0 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
162d0 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
162e0 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
162f0 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
16300 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
16310 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
16320 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
16330 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
16340 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73  [0] = (u8)(flags
16350 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20   & 0xff);       
16360 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54       /* ON DELET
16370 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46  E action */.  pF
16380 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20  Key->aAction[1] 
16390 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e  = (u8)((flags >>
163a0 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20   8 ) & 0xff);   
163b0 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63   /* ON UPDATE ac
163c0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
163d0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
163e0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
163f0 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a   p->pSchema) );.
16400 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65    pNextTo = (FKe
16410 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49  y *)sqlite3HashI
16420 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
16430 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20  a->fkeyHash, .  
16440 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
16450 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
16460 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
16470 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73  ==pFKey ){.    s
16480 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
16490 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  b);.    goto fk_
164a0 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
164b0 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73  NextTo ){.    as
164c0 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70  sert( pNextTo->p
164d0 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  PrevTo==0 );.   
164e0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
164f0 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70  = pNextTo;.    p
16500 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20  NextTo->pPrevTo 
16510 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  = pFKey;.  }..  
16520 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
16530 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
16540 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
16550 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
16560 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
16570 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
16580 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
16590 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
165a0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
165b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
165c0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
165d0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
165e0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
165f0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
16600 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
16610 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
16620 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16630 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
16640 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
16650 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
16660 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
16670 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
16680 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
16690 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
166a0 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
166b0 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
166c0 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
166d0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
166e0 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
166f0 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
16700 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
16710 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
16720 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
16730 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
16740 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
16750 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
16760 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
16770 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
16780 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
16790 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
167a0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
167b0 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
167c0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
167d0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
167e0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
167f0 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
16800 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
16810 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
16820 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
16830 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
16840 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  =1 ); /* EV: R-3
16850 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20  0323-21917 */.  
16860 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
16870 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72  d = (u8)isDeferr
16880 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
16890 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
168a0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
168b0 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
168c0 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
168d0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
168e0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
168f0 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
16900 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
16910 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
16920 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
16930 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
16940 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
16950 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
16960 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
16970 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
16980 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
16990 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
169a0 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65  The register spe
169b0 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
169c0 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
169d0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
169e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
169f0 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
16a00 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
16a10 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
16a20 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
16a30 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
16a40 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
16a50 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
16a60 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
16a70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16a80 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
16a90 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
16aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16ab0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
16ac0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
16ad0 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
16ae0 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
16af0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
16b00 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
16b10 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
16b20 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
16b30 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
16b40 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16b50 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
16b60 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
16b70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
16b80 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
16b90 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
16ba0 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
16bb0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
16bc0 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20   iSorter;       
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16be0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  ursor opened by 
16bf0 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69  OpenSorter (if i
16c00 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20  n use) */.  int 
16c10 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
16c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16c30 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
16c40 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
16c50 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
16c60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16c70 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ess to jump to f
16c80 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
16c90 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  n */.  int tnum;
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
16cc0 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
16cd0 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62   int iPartIdxLab
16ce0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
16cf0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
16d00 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20  label to skip a 
16d10 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  row */.  Vdbe *v
16d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16d30 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
16d40 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
16d50 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
16d60 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
16d70 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
16d80 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
16d90 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
16da0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dc0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
16dd0 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e  ing assembled in
16de0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
16df0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
16e00 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
16e10 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16e20 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
16e30 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
16e40 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
16e50 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
16e60 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
16e70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
16e80 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
16e90 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16ea0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
16eb0 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
16ec0 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
16ed0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
16ee0 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
16ef0 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
16f00 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
16f10 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
16f20 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
16f30 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
16f40 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
16f50 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
16f60 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
16f70 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
16f80 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
16f90 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16fa0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
16fb0 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
16fc0 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
16fd0 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
16fe0 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
16ff0 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
17000 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b  ->tnum;.  }.  pK
17010 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
17020 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
17030 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73  e, pIndex);.  as
17040 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c  sert( pKey!=0 ||
17050 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17060 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
17070 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  r );..  /* Open 
17080 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
17090 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
170a0 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
170b0 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
170c0 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
170d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
170e0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
170f0 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d  rter, 0, pIndex-
17100 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a  >nKeyCol, (char*
17110 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
17120 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
17130 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50  InfoRef(pKey), P
17140 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f  4_KEYINFO);..  /
17150 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  * Open the table
17160 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  . Loop through a
17170 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
17180 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20  able, inserting 
17190 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72  index.  ** recor
171a0 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ds into the sort
171b0 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  er. */.  sqlite3
171c0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
171d0 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
171e0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
171f0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
17200 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17210 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
17220 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
17230 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
17240 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
17250 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17260 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
17270 74 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73  te(pParse);..  s
17280 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
17290 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49  dexKey(pParse,pI
172a0 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63  ndex,iTab,regRec
172b0 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c  ord,0,&iPartIdxL
172c0 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c  abel,0,0);.  sql
172d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
172e0 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
172f0 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  t, iSorter, regR
17300 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
17310 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
17320 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61  abel(pParse, iPa
17330 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73  rtIdxLabel);.  s
17340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17350 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
17360 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  b, addr1+1); Vdb
17370 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17380 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17390 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
173a0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
173b0 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  <0 ) sqlite3Vdbe
173c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
173d0 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
173e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
173f0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
17400 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
17410 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
17420 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
17430 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
17440 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
17450 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
17460 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28  PFLAG_BULKCSR|((
17470 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f  memRootPage>=0)?
17480 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30  OPFLAG_P2ISREG:0
17490 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73  ));..  addr1 = s
174a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
174b0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
174c0 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20  t, iSorter, 0); 
174d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
174e0 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
174f0 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b 0a  ndex(pIndex) ){.
17500 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c      int j2 = sql
17510 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
17520 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
17530 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
17540 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
17550 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
17560 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 4f 45 5f  Abortable(v, OE_
17570 41 62 6f 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  Abort);.    sqli
17580 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
17590 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d  (v, OP_SorterCom
175a0 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a  pare, iSorter, j
175b0 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  2, regRecord,.  
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175d0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
175e0 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
175f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
17600 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
17610 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45  raint(pParse, OE
17620 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b  _Abort, pIndex);
17630 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17640 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b  JumpHere(v, j2);
17650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
17660 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
17670 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
17680 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
17690 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
176a0 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74  orterData, iSort
176b0 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69  er, regRecord, i
176c0 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
176d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
176e0 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a  SeekEnd, iIdx);.
176f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17700 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
17710 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
17720 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
17730 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
17740 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
17750 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
17760 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17770 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
17780 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
177a0 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
177b0 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f  , addr2); VdbeCo
177c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
177d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
177e0 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73  (v, addr1);..  s
177f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17800 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
17810 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
17820 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
17830 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73  lose, iIdx);.  s
17840 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17850 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
17860 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orter);.}../*.**
17870 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73   Allocate heap s
17880 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20  pace to hold an 
17890 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74  Index object wit
178a0 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a  h nCol columns..
178b0 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  **.** Increase t
178c0 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  he allocation si
178d0 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  ze to provide an
178e0 20 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79   extra nExtra by
178f0 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65  tes.** of 8-byte
17900 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61   aligned space a
17910 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
17920 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
17930 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
17940 20 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63   this extra spac
17950 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a  e in *ppExtra..*
17960 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
17970 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
17980 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
17990 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
179a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
179b0 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c  on */.  i16 nCol
179c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
179d0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
179e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
179f0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ndex */.  int nE
17a00 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f  xtra,          /
17a10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
17a20 73 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65  s of extra space
17a30 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   to alloc */.  c
17a40 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20  har **ppExtra   
17a50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
17a60 6f 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70  o the "extra" sp
17a70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ace */.){.  Inde
17a80 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
17a90 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e   /* Allocated in
17aa0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
17ab0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
17ac0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
17ad0 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78   space for Index
17ae0 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73   object + arrays
17af0 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52   */..  nByte = R
17b00 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
17b10 65 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  ex)) +          
17b20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
17b30 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
17b40 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
17b50 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20  of(char*)*nCol) 
17b60 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  +         /* Ind
17b70 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
17b80 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
17b90 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  8(sizeof(LogEst)
17ba0 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
17bb0 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f  /* Index.aiRowLo
17bc0 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  gEst   */.      
17bd0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
17be0 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
17bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17c00 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
17c30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
17c40 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
17c50 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
17c60 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
17c70 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
17c80 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
17c90 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
17ca0 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
17cb0 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
17cc0 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
17cd0 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
17ce0 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  **)pExtra; pExtr
17cf0 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  a += ROUND8(size
17d00 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
17d10 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67  .    p->aiRowLog
17d20 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  Est = (LogEst*)p
17d30 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
17d40 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a   sizeof(LogEst)*
17d50 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d  (nCol+1);.    p-
17d60 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
17d70 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20  *)pExtra;       
17d80 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
17d90 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20  (i16)*nCol;.    
17da0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
17db0 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20  (u8*)pExtra;.   
17dc0 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43   p->nColumn = nC
17dd0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43  ol;.    p->nKeyC
17de0 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20  ol = nCol - 1;. 
17df0 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28     *ppExtra = ((
17e00 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65  char*)p) + nByte
17e10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
17e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
17e30 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
17e40 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
17e50 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
17e60 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
17e70 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
17e80 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
17e90 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
17ea0 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
17eb0 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
17ec0 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
17ed0 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
17ee0 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
17ef0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
17f00 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
17f10 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
17f20 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
17f30 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
17f40 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
17f50 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
17f60 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
17f70 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
17f80 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
17f90 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
17fa0 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
17fb0 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
17fc0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
17fd0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
17fe0 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
17ff0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
18000 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
18010 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
18020 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
18030 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
18040 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
18050 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
18060 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
18070 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
18080 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
18090 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
180a0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
180b0 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
180c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
180d0 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
180e0 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
180f0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
18100 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
18110 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
18120 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
18130 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
18140 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
18150 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
18160 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
18170 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
18180 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
18190 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
181a0 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
181b0 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
181c0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
181d0 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
181e0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
181f0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
18200 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
18210 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
18220 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
18230 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
18240 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
18250 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
18260 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
18270 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
18280 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
18290 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57  PIWhere,    /* W
182a0 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
182b0 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
182c0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
182d0 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
182e0 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
182f0 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
18300 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
18310 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a  fNotExist,    /*
18320 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
18330 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
18340 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54  sts */.  u8 idxT
18350 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ype         /* T
18360 68 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f  he index type */
18370 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
18380 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
18390 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
183a0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
183b0 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
183c0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
183d0 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
183e0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
183f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18400 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
18410 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
18420 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
18430 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
18440 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
18450 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
18460 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
18470 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
18480 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
18490 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
184a0 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
184b0 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
184c0 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
184d0 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
184e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
184f0 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
18500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18510 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
18520 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
18530 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
18540 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
18550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18560 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
18570 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
18580 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
18590 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
185a0 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
185b0 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
185c0 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
185d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
185e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
185f0 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
18600 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
18610 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
18620 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18630 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
18640 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
18650 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
18660 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
18670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18680 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
18690 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
186a0 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
186b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
186c0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
186d0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
186e0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
186f0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
18700 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
18710 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
18720 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
18730 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
18740 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
18750 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
18760 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18770 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18780 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41  }.  if( IN_DECLA
18790 52 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79  RE_VTAB && idxTy
187a0 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
187b0 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b  PE_PRIMARYKEY ){
187c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
187d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
187e0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
187f0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
18800 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
18810 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18820 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
18830 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
18840 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
18850 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
18860 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
18870 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
18880 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
18890 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
188a0 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
188b0 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
188c0 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
188d0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
188e0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
188f0 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
18900 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
18910 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
18920 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
18930 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
18940 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18950 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
18960 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
18970 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
18980 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
18990 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
189a0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
189b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
189c0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
189d0 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
189e0 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
189f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
18a00 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
18a10 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
18a20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
18a30 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
18a40 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
18a50 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
18a60 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
18a70 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
18a80 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
18a90 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
18aa0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
18ab0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
18ac0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
18ad0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
18ae0 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
18af0 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
18b00 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
18b10 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
18b20 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
18b30 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
18b40 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
18b50 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
18b60 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
18b70 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
18b80 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
18b90 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
18ba0 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
18bb0 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
18bc0 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
18bd0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
18be0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
18bf0 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
18c00 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
18c10 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
18c20 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
18c30 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
18c40 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
18c50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
18c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
18c70 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
18c80 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
18c90 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
18ca0 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
18cb0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
18cc0 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
18cd0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
18ce0 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
18cf0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18d00 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
18d10 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
18d20 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
18d30 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
18d40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18d50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
18d60 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
18d70 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
18d80 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
18d90 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
18da0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
18db0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
18dc0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18dd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
18de0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
18df0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
18e00 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
18e10 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
18e20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
18e30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18e40 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
18e50 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
18e60 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
18e70 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
18e80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18e90 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
18ea0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
18eb0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
18ec0 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
18ed0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
18ee0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
18ef0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
18f00 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
18f10 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
18f20 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
18f30 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
18f40 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
18f50 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
18f60 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f  y==0.#if SQLITE_
18f70 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
18f80 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
18f90 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
18fa0 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
18fb0 3d 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  =0.#endif.#ifdef
18fc0 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53 51   SQLITE_ALLOW_SQ
18fd0 4c 49 54 45 5f 4d 41 53 54 45 52 5f 49 4e 44 45  LITE_MASTER_INDE
18fe0 58 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  X.       && sqli
18ff0 74 65 33 53 74 72 49 43 6d 70 28 26 70 54 61 62  te3StrICmp(&pTab
19000 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73 74  ->zName[7],"mast
19010 65 72 22 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20  er")!=0.#endif. 
19020 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
19030 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e  StrNICmp(&pTab->
19040 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74  zName[7],"altert
19050 61 62 5f 22 2c 39 29 21 3d 30 0a 20 29 7b 0a 20  ab_",9)!=0. ){. 
19060 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19070 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
19080 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
19090 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
190a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
190b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
190c0 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
190d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
190e0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
190f0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
19100 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19110 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
19120 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
19130 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
19140 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
19150 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
19160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19170 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
19180 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
19190 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
191a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
191b0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
191c0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
191d0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
191e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
191f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19200 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
19210 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
19220 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
19230 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
19240 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
19250 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
19260 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
19270 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
19280 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
19290 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
192a0 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
192b0 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
192c0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
192d0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
192e0 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
192f0 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
19300 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
19310 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
19320 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
19330 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
19340 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
19350 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
19360 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
19370 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
19380 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
19390 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
193a0 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
193b0 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
193c0 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
193d0 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
193e0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
193f0 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
19400 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
19410 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
19420 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
19430 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
19440 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
19450 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
19460 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
19470 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19480 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
19490 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20  rt( pName->z!=0 
194a0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
194b0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
194c0 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
194d0 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
194e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
194f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19500 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
19510 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
19520 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
19530 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
19540 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
19550 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19560 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
19570 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
19580 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
19590 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
195a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
195b0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
195c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
195d0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
195e0 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e  db, zName, pDb->
195f0 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zDbSName)!=0 ){.
19600 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74        if( !ifNot
19610 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  Exist ){.       
19620 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19630 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
19640 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
19650 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
19660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19670 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
19680 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20  it.busy );.     
19690 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
196a0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
196b0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  e, iDb);.      }
196c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
196d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
196e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
196f0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
19700 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
19710 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
19720 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
19730 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
19740 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
19750 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
19760 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
19770 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25  lite_autoindex_%
19780 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s_%d", pTab->zNa
19790 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  me, n);.    if( 
197a0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
197b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
197c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
197d0 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  .    /* Automati
197e0 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65  c index names ge
197f0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74  nerated from wit
19800 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  hin sqlite3_decl
19810 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a  are_vtab().    *
19820 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65  * must have name
19830 73 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69  s that are disti
19840 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20  nct from normal 
19850 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
19860 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68  names..    ** Th
19870 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
19880 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22  ement converts "
19890 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65  sqlite3_autoinde
198a0 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a  x..." into.    *
198b0 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69  * "sqlite3_butoi
198c0 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65  ndex..." in orde
198d0 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  r to make the na
198e0 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20  mes distinct..  
198f0 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65    ** The "vtab_e
19900 72 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65  rr.test" test de
19910 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e  monstrates the n
19920 65 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74  eed of this stat
19930 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ement. */.    if
19940 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  ( IN_DECLARE_VTA
19950 42 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a  B ) zName[7]++;.
19960 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
19970 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
19980 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
19990 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
199a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
199b0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
199c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
199d0 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53  *zDb = pDb->zDbS
199e0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
199f0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19a00 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
19a10 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
19a20 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
19a30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
19a40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
19a60 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
19a70 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
19a80 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
19a90 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
19aa0 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
19ab0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
19ac0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
19ad0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
19ae0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
19af0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
19b00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19b10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
19b20 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
19b30 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
19b40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
19b50 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
19b60 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
19b70 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
19b80 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
19b90 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
19ba0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
19bb0 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
19bc0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
19bd0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
19be0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
19bf0 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72   ){.    Token pr
19c00 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d  evCol;.    Colum
19c10 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d  n *pCol = &pTab-
19c20 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
19c30 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  -1];.    pCol->c
19c40 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
19c50 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 73  AG_UNIQUE;.    s
19c60 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
19c70 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e  &prevCol, pCol->
19c80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
19c90 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
19ca0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
19cb0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
19cc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c     sqlite3ExprAl
19cd0 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26  loc(db, TK_ID, &
19ce0 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20  prevCol, 0));.  
19cf0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
19d00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19d10 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
19d20 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
19d30 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  r==1 );.    sqli
19d40 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
19d50 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73  rtOrder(pList, s
19d60 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c  ortOrder);.  }el
19d70 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
19d80 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
19d90 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  th(pParse, pList
19da0 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a  , "index");.  }.
19db0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
19dc0 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
19dd0 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
19de0 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
19df0 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
19e00 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
19e10 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
19e20 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
19e30 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
19e40 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
19e50 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
19e60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
19e70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
19e80 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  =0 );.    if( pE
19e90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
19ea0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ATE ){.      nEx
19eb0 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69  tra += (1 + sqli
19ec0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
19ed0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20  r->u.zToken));. 
19ee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a     }.  }..  /* .
19ef0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
19f00 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
19f10 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65  e. .  */.  nName
19f20 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
19f30 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78  30(zName);.  nEx
19f40 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70  traCol = pPk ? p
19f50 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b  Pk->nKeyCol : 1;
19f60 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
19f70 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
19f80 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74  Object(db, pList
19f90 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61  ->nExpr + nExtra
19fa0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65             nName
19fd0 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26   + nExtra + 1, &
19fe0 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64  zExtra);.  if( d
19ff0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a000 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1a010 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a020 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
1a030 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1a040 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  T(pIndex->aiRowL
1a050 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  ogEst) );.  asse
1a060 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1a070 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
1a080 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
1a090 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45  ndex->zName = zE
1a0a0 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
1a0b0 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d  = nName + 1;.  m
1a0c0 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
1a0d0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
1a0e0 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
1a0f0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
1a100 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1a110 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
1a120 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1a130 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21  tNull = onError!
1a140 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64  =OE_None;.  pInd
1a150 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  ex->idxType = id
1a160 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d  xType;.  pIndex-
1a170 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
1a180 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
1a190 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  .  pIndex->nKeyC
1a1a0 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
1a1b0 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72  r;.  if( pPIWher
1a1c0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a1d0 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
1a1e0 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
1a1f0 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70  b, NC_PartIdx, p
1a200 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  PIWhere, 0);.   
1a210 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64   pIndex->pPartId
1a220 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72  xWhere = pPIWher
1a230 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20  e;.    pPIWhere 
1a240 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
1a250 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1a260 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1a270 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  b, 0) );..  /* C
1a280 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
1a290 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
1a2a0 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
1a2b0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
1a2c0 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
1a2d0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1a2e0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
1a2f0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
1a300 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
1a310 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1a320 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
1a330 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
1a340 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
1a350 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c  /* Analyze the l
1a360 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
1a370 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
1a380 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
1a390 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70  dex and.  ** rep
1a3a0 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20  ort any errors. 
1a3b0 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   In the common c
1a3c0 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78  ase where the ex
1a3d0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63  pression is exac
1a3e0 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65  tly.  ** a table
1a3f0 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74   column, store t
1a400 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69  hat column in ai
1a410 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67  Column[].  For g
1a420 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f  eneral expressio
1a430 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74  ns,.  ** populat
1a440 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  e pIndex->aColEx
1a450 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f  pr and store XN_
1a460 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43  EXPR (-2) in aiC
1a470 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20  olumn[]..  **.  
1a480 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1a490 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20   warning if two 
1a4a0 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
1a4b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  of the index are
1a4c0 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
1a4d0 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77   TODO: Issue a w
1a4e0 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61  arning if the ta
1a4f0 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ble primary key 
1a500 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
1a510 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  of the.  ** inde
1a520 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  x key..  */.  fo
1a530 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
1a540 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
1a550 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
1a560 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
1a570 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20    Expr *pCExpr; 
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64   /* The i-th ind
1a5a0 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ex expression */
1a5b0 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
1a5c0 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20  edSortOrder;    
1a5d0 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45      /* ASC or DE
1a5e0 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65  SC on the i-th e
1a5f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1a600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1a610 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1a620 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
1a630 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  uence name */.. 
1a640 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67     sqlite3String
1a650 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e  ToId(pListItem->
1a660 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
1a670 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
1a680 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
1a690 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72  pTab, NC_IdxExpr
1a6a0 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  , pListItem->pEx
1a6b0 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pr, 0);.    if( 
1a6c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
1a6d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1a6e0 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70  index;.    pCExp
1a6f0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1a700 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
1a710 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1a720 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70    if( pCExpr->op
1a730 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1a740 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70       if( pTab==p
1a750 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1a760 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a770 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1a780 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73  se, "expressions
1a790 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50   prohibited in P
1a7a0 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22  RIMARY KEY and "
1a7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7d0 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61   "UNIQUE constra
1a7e0 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ints");.        
1a7f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a800 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1a810 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
1a820 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b  ->aColExpr==0 ){
1a830 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
1a840 74 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  t *pCopy = sqlit
1a850 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1a860 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  , pList, 0);.   
1a870 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f       pIndex->aCo
1a880 6c 45 78 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20  lExpr = pCopy;. 
1a890 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
1a8a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1a8b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1a8c0 28 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20  ( pCopy!=0 );.  
1a8d0 20 20 20 20 20 20 20 20 70 4c 69 73 74 49 74 65          pListIte
1a8e0 6d 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d  m = &pCopy->a[i]
1a8f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a900 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e    }.      j = XN
1a910 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1a920 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a930 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
1a940 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1a950 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  tNull = 0;.    }
1a960 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20  else{.      j = 
1a970 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  pCExpr->iColumn;
1a980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
1a990 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  <=0x7fff );.    
1a9a0 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
1a9b0 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69       j = pTab->i
1a9c0 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  PKey;.      }els
1a9d0 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c  e if( pTab->aCol
1a9e0 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
1a9f0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1aa00 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1aa10 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1aa20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1aa30 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20  n[i] = (i16)j;. 
1aa40 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d     }.    zColl =
1aa50 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   0;.    if( pLis
1aa60 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  tItem->pExpr->op
1aa70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
1aa80 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b        int nColl;
1aa90 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1aaa0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
1aab0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1aac0 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nColl = sqlite3
1aad0 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20  Strlen30(zColl) 
1aae0 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
1aaf0 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c  t( nExtra>=nColl
1ab00 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
1ab10 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20  (zExtra, zColl, 
1ab20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43  nColl);.      zC
1ab30 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
1ab40 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43      zExtra += nC
1ab50 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  oll;.      nExtr
1ab60 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a -= nColl;.    
1ab70 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29  }else if( j>=0 )
1ab80 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  {.      zColl = 
1ab90 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
1aba0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
1abb0 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c  f( !zColl ) zCol
1abc0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  l = sqlite3StrBI
1abd0 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64  NARY;.    if( !d
1abe0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
1abf0 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
1ac00 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
1ac10 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
1ac20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ac30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1ac40 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1ac50 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
1ac60 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1ac70 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
1ac80 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
1ac90 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
1aca0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1acb0 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
1acc0 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
1acd0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1ace0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20  he table key to 
1acf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1ad00 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f  ndex.  For WITHO
1ad10 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61  UT ROWID.  ** ta
1ad20 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d  bles (when pPk!=
1ad30 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1ad40 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49  the declared PRI
1ad50 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20  MARY KEY.  For. 
1ad60 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65   ** normal table
1ad70 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20  s (when pPk==0) 
1ad80 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1ad90 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69   rowid..  */.  i
1ada0 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f  f( pPk ){.    fo
1adb0 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
1adc0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
1add0 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e     int x = pPk->
1ade0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1adf0 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20     assert( x>=0 
1ae00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  );.      if( has
1ae10 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61  Column(pIndex->a
1ae20 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d  iColumn, pIndex-
1ae30 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a  >nKeyCol, x) ){.
1ae40 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1ae50 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20  nColumn--; .    
1ae60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ae70 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1ae80 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20  n[i] = x;.      
1ae90 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1aea0 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [i] = pPk->azCol
1aeb0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  l[j];.        pI
1aec0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1aed0 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74  [i] = pPk->aSort
1aee0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
1aef0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
1af00 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1af10 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   i==pIndex->nCol
1af20 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  umn );.  }else{.
1af30 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1af40 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[i] = XN_ROW
1af50 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  ID;.    pIndex->
1af60 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  azColl[i] = sqli
1af70 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1af80 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
1af90 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
1afa0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1afb0 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65  pNewTable==0 ) e
1afc0 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
1afd0 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  h(pIndex);..  /*
1afe0 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 63   If this index c
1aff0 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f  ontains every co
1b000 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c  lumn of its tabl
1b010 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a  e, then mark.  *
1b020 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72 69  * it as a coveri
1b030 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73  ng index */.  as
1b040 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70  sert( HasRowid(p
1b050 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70  Tab) .      || p
1b060 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
1b070 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1b080 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61  ndex(pIndex, pTa
1b090 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a  b->iPKey)>=0 );.
1b0a0 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
1b0b0 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49 6e  nsNotIndexed(pIn
1b0c0 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62 6c  dex);.  if( pTbl
1b0d0 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65  Name!=0 && pInde
1b0e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62  x->nColumn>=pTab
1b0f0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49  ->nCol ){.    pI
1b100 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1b110 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
1b120 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1b130 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1b140 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
1b150 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1b160 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c    if( sqlite3Col
1b170 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65  umnOfIndex(pInde
1b180 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e  x,j)>=0 ) contin
1b190 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  ue;.      pIndex
1b1a0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30  ->isCovering = 0
1b1b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b1c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1b1d0 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1b1e0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
1b1f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
1b200 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
1b210 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
1b220 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
1b230 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
1b240 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
1b250 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1b260 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
1b270 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
1b280 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
1b290 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1b2a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
1b2b0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
1b2c0 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
1b2d0 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
1b2e0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1b2f0 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
1b300 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
1b310 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
1b320 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
1b330 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1b340 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
1b350 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1b360 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
1b370 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
1b380 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
1b390 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
1b3a0 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
1b3b0 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
1b3c0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
1b3d0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1b3e0 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
1b3f0 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
1b400 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
1b410 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
1b420 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1b430 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50   Two UNIQUE or P
1b440 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1b450 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69  raints are consi
1b460 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74  dered equivalent
1b470 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75  .    ** (and thu
1b480 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68  s suppressing th
1b490 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76  e second one) ev
1b4a0 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20  en if they have 
1b4b0 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a  different.    **
1b4c0 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20   sort orders..  
1b4d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
1b4e0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1b4f0 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nt collating seq
1b500 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65  uences or if the
1b510 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
1b520 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ** the constrain
1b530 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65  t occur in diffe
1b540 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65  rent orders, the
1b550 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1b560 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  s are.    ** con
1b570 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74  sidered distinct
1b580 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74   and both result
1b590 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64   in separate ind
1b5a0 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
1b5b0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1b5c0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1b5d0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1b5e0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1b5f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
1b600 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1b610 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1b620 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b630 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21  ( pIdx->idxType!
1b640 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1b650 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20  APPDEF );.      
1b660 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1b670 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b  Index(pIndex) );
1b680 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
1b690 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65  ->nKeyCol!=pInde
1b6a0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
1b6b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
1b6c0 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b  (k=0; k<pIdx->nK
1b6d0 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  eyCol; k++){.   
1b6e0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1b6f0 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  *z1;.        con
1b700 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20  st char *z2;.   
1b710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1b720 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d  x->aiColumn[k]>=
1b730 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1b740 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1b750 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
1b760 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
1b770 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49  .        z1 = pI
1b780 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
1b790 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64         z2 = pInd
1b7a0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
1b7b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1b7c0 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1b7d0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
1b7e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
1b7f0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
1b800 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1b810 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
1b820 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
1b830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
1b840 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
1b850 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
1b860 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
1b870 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1b880 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
1b890 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
1b8a0 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
1b8b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
1b8c0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
1b8d0 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
1b8e0 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
1b8f0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
1b900 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
1b910 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
1b920 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
1b930 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
1b940 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
1b950 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
1b960 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1b970 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
1b980 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
1b990 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
1b9a0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
1b9b0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
1b9c0 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
1b9d0 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
1b9e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1b9f0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1ba00 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
1ba10 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1ba20 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
1ba30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ba40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ba50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ba60 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
1ba70 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1ba80 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
1ba90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1baa0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
1bab0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1bac0 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
1bad0 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
1bae0 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
1baf0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
1bb00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1bb10 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70 65       if( idxType
1bb20 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ==SQLITE_IDXTYPE
1bb30 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49  _PRIMARYKEY ) pI
1bb40 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  dx->idxType = id
1bb50 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 67  xType;.        g
1bb60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1bb70 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1bb80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
1bb90 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
1bba0 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
1bbb0 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
1bbc0 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
1bbd0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1bbe0 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
1bbf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1bc00 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1bc10 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
1bc20 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
1bc30 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74  x *p;.    assert
1bc40 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
1bc50 41 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  AB );.    assert
1bc60 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1bc70 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
1bc80 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
1bc90 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   );.    p = sqli
1bca0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
1bcb0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
1bcc0 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1bcf0 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  e, pIndex);.    
1bd00 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
1bd10 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
1bd20 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
1bd30 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1bd40 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1bd50 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
1bd60 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1bd70 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1bd80 7d 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  }.    db->mDbFla
1bd90 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
1bda0 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 69  emaChange;.    i
1bdb0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
1bdc0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1bdd0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
1bde0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
1bdf0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
1be00 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1be10 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1be20 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
1be30 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1be40 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1be50 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1be60 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1be70 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1be80 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20  aint) then.  ** 
1be90 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c  emit code to all
1bea0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1beb0 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b  rootpage on disk
1bec0 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74   and make an ent
1bed0 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  ry for.  ** the 
1bee0 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c  index in the sql
1bef0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1bf00 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
1bf10 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a  e index with.  *
1bf20 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c  * content.  But,
1bf30 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1bf40 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79  if we are simply
1bf50 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
1bf60 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
1bf70 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74  table to parse t
1bf80 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66  he schema, or if
1bf90 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
1bfa0 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
1bfb0 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57  ndex.  ** of a W
1bfc0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1bfd0 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
1bfe0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1bff0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1c000 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1c010 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1c020 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20  ARY KEY.  ** or 
1c030 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1c040 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1c050 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1c060 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
1c070 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
1c080 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
1c090 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
1c0a0 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
1c0b0 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
1c0c0 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
1c0d0 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
1c0e0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1c0f0 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20   || pTblName!=0 
1c100 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
1c110 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
1c120 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
1c130 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c140 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
1c150 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1c160 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
1c170 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1c180 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c  _index;..    sql
1c190 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1c1a0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1c1b0 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  1, iDb);..    /*
1c1c0 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
1c1d0 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
1c1e0 65 78 20 75 73 69 6e 67 20 43 72 65 61 74 65 49  ex using CreateI
1c1f0 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65  ndex. But before
1c200 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f  .    ** doing so
1c210 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e  , code a Noop in
1c220 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74  struction and st
1c230 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20  ore its address 
1c240 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78  in .    ** Index
1c250 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72  .tnum. This is r
1c260 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
1c270 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63  this index is ac
1c280 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a  tually a .    **
1c290 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1c2a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63   the table is ac
1c2b0 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54  tually a WITHOUT
1c2c0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e   ROWID table. In
1c2d0 20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61   .    ** that ca
1c2e0 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f  se the convertTo
1c2f0 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
1c300 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  e() routine will
1c310 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20   replace.    ** 
1c320 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20  the Noop with a 
1c330 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65  Goto to jump ove
1c340 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20  r the VDBE code 
1c350 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e  generated below.
1c360 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   */.    pIndex->
1c370 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64  tnum = sqlite3Vd
1c380 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e  beAddOp0(v, OP_N
1c390 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oop);.    sqlite
1c3a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1c3b0 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20 69  P_CreateBtree, i
1c3c0 44 62 2c 20 69 4d 65 6d 2c 20 42 54 52 45 45 5f  Db, iMem, BTREE_
1c3d0 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20 20 20 20 2f  BLOBKEY);..    /
1c3e0 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
1c3f0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
1c400 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
1c410 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
1c420 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
1c430 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
1c440 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1c450 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28  .      int n = (
1c460 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61  int)(pParse->sLa
1c470 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d  stToken.z - pNam
1c480 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  e->z) + pParse->
1c490 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
1c4a0 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a      if( pName->z
1c4b0 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d  [n-1]==';' ) n--
1c4c0 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  ;.      /* A nam
1c4d0 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
1c4e0 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
1c4f0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1c500 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
1c510 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1c520 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49  (db, "CREATE%s I
1c530 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
1c540 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
1c550 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
1c560 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d  IQUE", n, pName-
1c570 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
1c580 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
1c590 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
1c5a0 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
1c5b0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1c5c0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1c5d0 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
1c5e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
1c5f0 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  ; */.      zStmt
1c600 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
1c610 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
1c620 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   in sqlite_maste
1c630 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  r for this index
1c640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1c650 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
1c660 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1c670 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
1c680 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
1c690 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b  ',%Q,%Q,#%d,%Q);
1c6a0 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
1c6b0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1c6c0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
1c6d0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1c6e0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
1c6f0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1c700 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
1c710 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
1c720 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c730 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1c740 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1c750 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1c760 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1c770 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1c780 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
1c790 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1c7a0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1c7b0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
1c7c0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1c7d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c7e0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1c7f0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
1c800 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1c810 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1c820 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1c830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c840 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
1c850 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73   iDb,.         s
1c860 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c870 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  , "name='%q' AND
1c880 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
1c890 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
1c8a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c8b0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45  beAddOp0(v, OP_E
1c8c0 78 70 69 72 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  xpire);.    }.. 
1c8d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1c8e0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78  mpHere(v, pIndex
1c8f0 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20  ->tnum);.  }..  
1c900 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
1c910 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
1c920 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
1c930 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
1c940 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
1c950 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
1c960 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
1c970 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
1c980 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
1c990 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
1c9a0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
1c9b0 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72  e correct constr
1c9c0 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20  aint check.  ** 
1c9d0 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73  processing (in s
1c9e0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
1c9f0 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29  nstraintChecks()
1ca00 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a  ) as part of.  *
1ca10 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53  * UPDATE and INS
1ca20 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ERT statements. 
1ca30 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
1ca40 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
1ca50 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
1ca60 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
1ca70 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
1ca80 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
1ca90 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
1caa0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1cab0 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
1cac0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1cad0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1cae0 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
1caf0 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1cb00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
1cb10 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
1cb20 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1cb30 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
1cb40 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
1cb50 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
1cb60 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
1cb70 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
1cb80 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1cb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1cba0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
1cbb0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1cbc0 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
1cbd0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1cbe0 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
1cbf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
1cc00 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
1cc10 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
1cc20 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
1cc30 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65  Index ) freeInde
1cc40 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1cc50 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1cc60 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1cc70 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1cc80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1cc90 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1cca0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1ccb0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1ccc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ccd0 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zName);.}../*.**
1cce0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1ccf0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1cd00 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1cd10 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1cd20 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1cd30 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1cd40 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1cd50 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1cd60 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1cd70 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  ] is supposed to
1cd80 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1cd90 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1cda0 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1cdb0 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1cdc0 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1cdd0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1cde0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1cdf0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1ce00 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1ce10 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1ce20 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1ce30 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1ce40 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1ce50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1ce60 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1ce70 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1ce80 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1ce90 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1cea0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1ceb0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1cec0 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1ced0 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1cee0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1cef0 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1cf00 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1cf10 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1cf20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1cf30 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1cf40 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1cf50 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1cf60 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1cf70 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1cf80 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1cf90 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1cfa0 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1cfb0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1cfc0 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1cfd0 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1cfe0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1cff0 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1d000 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1d010 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1d020 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1d030 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1d040 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
1d050 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
1d060 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
1d070 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
1d080 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
1d090 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
1d0a0 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
1d0b0 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
1d0c0 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
1d0d0 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
1d0e0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
1d0f0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e   int i;..  /* In
1d100 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61 75  dexes with defau
1d110 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73  lt row estimates
1d120 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
1d130 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20   stat1 data */. 
1d140 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e   assert( !pIdx->
1d150 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f  hasStat1 );..  /
1d160 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1d170 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66  entry (number of
1d180 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
1d190 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d  ex) to the estim
1d1a0 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  ated .  ** numbe
1d1b0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1d1c0 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20   table, or half 
1d1d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1d1e0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a  ws in the table.
1d1f0 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69    ** for a parti
1d200 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20  al index.   But 
1d210 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65  do not let the e
1d220 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c  stimate drop bel
1d230 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d  ow 10. */.  a[0]
1d240 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1d250 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  >nRowLogEst;.  i
1d260 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  f( pIdx->pPartId
1d270 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d  xWhere!=0 ) a[0]
1d280 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28   -= 10;  assert(
1d290 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
1d2a0 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61  st(2) );.  if( a
1d2b0 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20  [0]<33 ) a[0] = 
1d2c0 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  33;             
1d2d0 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33 3d       assert( 33=
1d2e0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1d2f0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69  0) );..  /* Esti
1d300 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69  mate that a[1] i
1d310 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c  s 10, a[2] is 9,
1d320 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d   a[3] is 8, a[4]
1d330 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20   is 7, a[5] is. 
1d340 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73   ** 6 and each s
1d350 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20  ubsequent value 
1d360 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20  (if any) is 5.  
1d370 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31  */.  memcpy(&a[1
1d380 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73  ], aVal, nCopy*s
1d390 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a  izeof(LogEst));.
1d3a0 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b    for(i=nCopy+1;
1d3b0 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   i<=pIdx->nKeyCo
1d3c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69  l; i++){.    a[i
1d3d0 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20  ] = 23;         
1d3e0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1d3f0 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 23==sqlite3Lo
1d400 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a  gEst(5) );.  }..
1d410 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
1d420 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b  ite3LogEst(1) );
1d430 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
1d440 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b 70  ndex(pIdx) ) a[p
1d450 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20  Idx->nKeyCol] = 
1d460 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
1d470 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
1d480 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
1d490 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
1d4a0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
1d4b0 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
1d4c0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1d4d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d4e0 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
1d4f0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1d500 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
1d510 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
1d520 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
1d530 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
1d540 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d550 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
1d560 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1d570 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
1d580 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
1d590 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
1d5a0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1d5b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1d5c0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1d5d0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
1d5e0 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
1d5f0 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
1d600 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1d610 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1d620 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1d630 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1d640 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1d650 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1d660 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
1d670 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
1d680 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
1d690 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
1d6a0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
1d6b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d6c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d6d0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
1d6e0 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
1d6f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d700 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1d710 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1d720 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
1d730 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1d740 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1d750 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1d760 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
1d770 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1d780 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
1d790 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1d7a0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b  DXTYPE_APPDEF ){
1d7b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1d7c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
1d7d0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1d7e0 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
1d7f0 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
1d800 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
1d810 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
1d820 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
1d830 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1d840 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1d850 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1d860 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
1d870 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
1d880 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1d890 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
1d8a0 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
1d8b0 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
1d8c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1d8d0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
1d8e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d8f0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1d900 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
1d910 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1d920 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
1d930 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
1d940 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1d950 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1d960 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
1d970 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1d980 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1d990 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
1d9a0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1d9b0 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20  && iDb ) code = 
1d9c0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
1d9d0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1d9e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1d9f0 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
1da00 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
1da10 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
1da20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1da30 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1da40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1da50 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1da60 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
1da70 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
1da80 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
1da90 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
1daa0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1dab0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1dac0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1dad0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1dae0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
1daf0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1db00 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
1db10 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
1db20 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d   %Q.%s WHERE nam
1db30 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69  e=%Q AND type='i
1db40 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64  ndex'",.       d
1db50 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
1db60 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
1db70 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  E, pIndex->zName
1db80 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1db90 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
1dba0 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
1dbb0 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  "idx", pIndex->z
1dbc0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1dbd0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1dbe0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1dbf0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
1dc00 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
1dc10 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
1dc20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dc30 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p4(v, OP_DropInd
1dc40 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  ex, iDb, 0, 0, p
1dc50 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
1dc60 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
1dc70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
1dc80 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1dc90 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
1dca0 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20  .** pArray is a 
1dcb0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
1dcc0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1dcd0 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
1dce0 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
1dcf0 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
1dd00 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69  size. This routi
1dd10 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44  ne uses sqlite3D
1dd20 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f  bRealloc().** to
1dd30 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61   extend the arra
1dd40 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  y so that there 
1dd50 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  is space for a n
1dd60 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ew object at the
1dd70 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   end..**.** When
1dd80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1dd90 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74  s called, *pnEnt
1dda0 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ry contains the 
1ddb0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1ddc0 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e  ** the array (in
1ddd0 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68   entries - so th
1dde0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
1ddf0 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a  ((*pnEntry) * sz
1de00 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20  Entry) bytes.** 
1de10 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a  in total)..**.**
1de20 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   If the realloc(
1de30 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20  ) is successful 
1de40 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20  (i.e. if no OOM 
1de50 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
1de60 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ), the.** space 
1de70 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1de80 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
1de90 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79  zeroed, *pnEntry
1dea0 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72   updated to.** r
1deb0 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
1dec0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
1ded0 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
1dee0 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  o the new alloca
1def0 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64  tion.** returned
1df00 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  . *pIdx is set t
1df10 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1df20 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74  he new array ent
1df30 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ry in this case.
1df40 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1df50 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  , if the realloc
1df60 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20  () fails, *pIdx 
1df70 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70  is set to -1, *p
1df80 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a  nEntry remains.*
1df90 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
1dfa0 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79  a copy of pArray
1dfb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f   returned..*/.vo
1dfc0 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
1dfd0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
1dfe0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
1dff0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
1e000 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
1e010 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
1e020 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
1e030 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
1e040 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
1e050 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
1e060 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
1e070 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
1e080 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
1e090 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
1e0a0 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20  pnEntry,     /* 
1e0b0 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  Number of object
1e0c0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  s currently in u
1e0d0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  se */.  int *pId
1e0e0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
1e0f0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
1e100 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
1e110 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
1e120 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e  .  int n = *pnEn
1e130 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20  try;.  if( (n & 
1e140 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (n-1))==0 ){.   
1e150 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29   int sz = (n==0)
1e160 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20   ? 1 : 2*n;.    
1e170 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c  void *pNew = sql
1e180 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1e190 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45  , pArray, sz*szE
1e1a0 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70  ntry);.    if( p
1e1b0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1e1c0 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20  *pIdx = -1;.    
1e1d0 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1e1e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61  .    }.    pArra
1e1f0 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
1e200 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61  z = (char*)pArra
1e210 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e  y;.  memset(&z[n
1e220 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
1e230 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
1e240 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  x = n;.  ++*pnEn
1e250 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
1e260 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
1e270 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
1e280 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
1e290 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
1e2a0 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
1e2b0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
1e2c0 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
1e2d0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1e2e0 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
1e2f0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
1e300 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
1e310 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a  Append(sqlite3 *
1e320 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1e330 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1e340 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1e350 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1e360 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e370 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1e380 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
1e390 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1e3a0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1e3b0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
1e3c0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1e3d0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
1e3e0 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
1e3f0 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
1e400 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
1e410 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
1e420 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1e430 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
1e440 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1e450 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1e460 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1e470 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
1e480 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1e490 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1e4a0 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
1e4b0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1e4c0 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
1e4d0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1e4e0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1e4f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1e500 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1e510 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1e520 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1e530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1e540 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1e550 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e560 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1e570 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
1e580 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e590 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
1e5a0 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
1e5b0 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1e5c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1e5d0 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
1e5e0 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
1e5f0 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
1e600 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
1e610 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
1e620 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
1e630 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
1e640 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1e650 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1e660 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1e670 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
1e680 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1e690 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1e6a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
1e6b0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1e6c0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1e6d0 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1e6e0 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1e6f0 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
1e700 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1e710 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1e720 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
1e730 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
1e740 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
1e750 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
1e760 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
1e770 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
1e780 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
1e790 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1e7a0 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
1e7b0 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
1e7c0 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
1e7d0 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
1e7e0 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
1e7f0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
1e800 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
1e810 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1e820 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1e830 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
1e840 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
1e850 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
1e860 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
1e870 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
1e880 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
1e890 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
1e8a0 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
1e8b0 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
1e8c0 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
1e8d0 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
1e8e0 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
1e8f0 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
1e900 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
1e910 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
1e920 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
1e930 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
1e940 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
1e950 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
1e960 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
1e970 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68  ocation fails th
1e980 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63  e SrcList is unc
1e990 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hanged.  The.** 
1e9a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e9b0 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65   flag will be se
1e9c0 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72  t to true..*/.Sr
1e9d0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1e9e0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
1e9f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1ea00 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1ea10 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1ea20 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72  ify of OOM error
1ea30 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1ea40 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
1ea50 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
1ea60 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
1ea70 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
1ea80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
1ea90 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
1eaa0 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
1eab0 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
1eac0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1ead0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
1eae0 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
1eaf0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1eb00 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
1eb10 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
1eb20 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
1eb30 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
1eb40 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1eb50 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1eb60 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
1eb70 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
1eb80 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
1eb90 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
1eba0 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
1ebb0 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28  eeded */.  if( (
1ebc0 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  u32)pSrc->nSrc+n
1ebd0 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
1ebe0 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
1ebf0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
1ec00 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
1ec10 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a 20  nSrc*2+nExtra;. 
1ec20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
1ec30 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1ec40 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
1ec50 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
1ec60 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
1ec70 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
1ec80 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
1ec90 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1eca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1ecb0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1ecc0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
1ecd0 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
1ece0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
1ecf0 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
1ed00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1ed10 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
1ed20 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
1ed30 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
1ed40 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
1ed50 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a  loc = nGot;.  }.
1ed60 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
1ed70 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
1ed80 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
1ed90 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
1eda0 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
1edb0 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
1edc0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
1edd0 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
1ede0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
1edf0 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
1ee00 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
1ee10 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
1ee20 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
1ee30 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
1ee40 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
1ee50 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
1ee60 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
1ee70 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
1ee80 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
1ee90 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
1eea0 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
1eeb0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
1eec0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1eed0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1eee0 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
1eef0 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
1ef00 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
1ef10 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1ef20 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
1ef30 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1ef40 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1ef50 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
1ef60 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
1ef70 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
1ef80 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
1ef90 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
1efa0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
1efb0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
1efc0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1efd0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
1efe0 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
1eff0 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
1f000 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
1f010 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
1f020 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
1f030 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
1f040 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
1f050 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
1f060 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
1f070 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
1f080 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
1f090 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
1f0a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
1f0b0 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
1f0c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
1f0d0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
1f0e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1f0f0 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
1f100 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
1f110 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
1f120 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
1f130 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
1f140 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
1f150 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
1f160 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1f170 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
1f180 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
1f190 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
1f1a0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
1f1b0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
1f1c0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
1f1d0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
1f1e0 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
1f1f0 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
1f200 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
1f210 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
1f220 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
1f230 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
1f240 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
1f250 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
1f260 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
1f270 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
1f280 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
1f290 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
1f2a0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
1f2b0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
1f2c0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1f2d0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1f2e0 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
1f2f0 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
1f300 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1f310 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
1f320 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
1f330 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
1f340 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1f350 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1f360 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1f370 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
1f380 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
1f390 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
1f3a0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
1f3b0 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
1f3c0 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
1f3d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1f3e0 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
1f3f0 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
1f400 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1f410 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1f420 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
1f430 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
1f440 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
1f450 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
1f460 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
1f470 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
1f480 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
1f490 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
1f4a0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1f4b0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1f4c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1f4d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1f4e0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1f4f0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1f500 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1f510 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
1f520 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
1f530 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
1f540 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
1f550 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1f560 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
1f570 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
1f580 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1f590 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
1f5a0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
1f5b0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1f5c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1f5d0 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  m;.  assert( pDa
1f5e0 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
1f5f0 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
1f600 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
1f610 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72  out B */.  asser
1f620 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
1f630 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1f640 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f650 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
1f660 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
1f670 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1f680 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1f690 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
1f6a0 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c  lloc = 1;.    pL
1f6b0 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20  ist->nSrc = 1;. 
1f6c0 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74     memset(&pList
1f6d0 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[0], 0, sizeo
1f6e0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
1f6f0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
1f700 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
1f710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 69 73   }else{.    pLis
1f720 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  t = sqlite3SrcLi
1f730 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c  stEnlarge(db, pL
1f740 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
1f750 53 72 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Src);.  }.  if( 
1f760 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f770 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1f780 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1f790 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1f7a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74  urn 0;.  }.  pIt
1f7b0 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
1f7c0 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  List->nSrc-1];. 
1f7d0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
1f7e0 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
1f7f0 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
1f800 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
1f810 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
1f820 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
1f830 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f840 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61  mToken(db, pData
1f850 62 61 73 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  base);.    pItem
1f860 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
1f870 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1f880 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  en(db, pTable);.
1f890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
1f8a0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
1f8b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1f8c0 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
1f8d0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
1f8e0 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  se = 0;.  }.  re
1f8f0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1f900 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65  *.** Assign Vdbe
1f910 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d  Cursor index num
1f920 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  bers to all tabl
1f930 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
1f940 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1f950 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1f960 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
1f970 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
1f980 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1f990 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f9a0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1f9b0 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
1f9c0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1f9d0 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
1f9e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1f9f0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
1fa00 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
1fa10 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1fa20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
1fa30 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
1fa40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
1fa50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
1fa60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1fa70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1fa80 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1fa90 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1faa0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
1fab0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
1fac0 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
1fad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fae0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1faf0 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
1fb00 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
1fb10 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
1fb20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fb30 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73  3SrcListDelete(s
1fb40 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
1fb50 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1fb60 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1fb70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1fb80 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
1fb90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1fba0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1fbb0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
1fbc0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1fbd0 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
1fbe0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1fbf0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1fc00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1fc10 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
1fc20 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1fc30 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1fc40 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  >zAlias);.    if
1fc50 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
1fc60 64 65 78 65 64 42 79 20 29 20 73 71 6c 69 74 65  dexedBy ) sqlite
1fc70 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1fc80 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
1fc90 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1fca0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1fcb0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1fcc0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1fcd0 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a  ->u1.pFuncArg);.
1fce0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
1fcf0 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d  eTable(db, pItem
1fd00 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
1fd10 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1fd20 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1fd30 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
1fd40 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1fd50 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
1fd60 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1fd70 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1fd80 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
1fd90 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
1fda0 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1fdb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fdc0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1fdd0 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1fde0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1fdf0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1fe00 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1fe10 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1fe20 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1fe30 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1fe40 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1fe50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1fe60 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1fe70 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1fe80 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1fe90 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1fea0 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1feb0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1fec0 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1fed0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1fee0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1fef0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ff00 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1ff10 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1ff20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ff30 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1ff40 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1ff50 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1ff60 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20  the term has an 
1ff70 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1ff80 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1ff90 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1ffa0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1ffb0 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1ffc0 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1ffd0 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1ffe0 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1fff0 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
20000 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
20010 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
20020 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
20030 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
20040 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
20050 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
20060 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
20070 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
20080 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
20090 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
200a0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
200b0 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
200c0 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
200d0 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
200e0 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
200f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
20100 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
20110 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
20120 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
20130 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
20140 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
20150 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
20160 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
20170 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
20180 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
20190 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
201a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
201b0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
201c0 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
201d0 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
201e0 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
201f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
20200 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
20210 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
20220 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
20230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
20240 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
20250 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
20260 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
20270 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
20280 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
20290 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
202a0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
202b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
202d0 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
202e0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
202f0 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
20300 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
20310 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
20320 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
20330 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20340 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
20350 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20360 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
20370 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
20380 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
20390 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
203a0 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
203b0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
203c0 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
203d0 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
203e0 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
203f0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
20400 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
20410 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
20420 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
20430 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
20440 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
20450 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
20460 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
20470 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e  assert( p->nSrc>
20480 30 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 26  0 );.  pItem = &
20490 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
204a0 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
204b0 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
204c0 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
204d0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
204e0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
204f0 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
20500 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
20510 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
20520 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
20530 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
20540 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
20550 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
20560 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
20570 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
20580 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
20590 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
205a0 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
205b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
205c0 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
205d0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
205e0 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
205f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20600 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
20610 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
20620 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
20630 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
20640 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
20650 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
20660 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
20670 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
20680 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20690 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
206a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
206b0 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
206c0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
206d0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
206e0 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
206f0 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42 79   p && pIndexedBy
20700 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 72  ->n>0 ){.    str
20710 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20720 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
20730 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29  ert( p->nSrc>0 )
20740 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
20750 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
20760 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20770 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
20780 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20790 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
207a0 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
207b0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
207c0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
207d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
207e0 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
207f0 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
20800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
20810 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
20820 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
20830 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
20840 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
20850 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
20860 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
20870 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e       pItem->fg.n
20880 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
20890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
208a0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
208b0 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61  edBy = sqlite3Na
208c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
208d0 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64  se->db, pIndexed
208e0 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  By);.      pItem
208f0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
20900 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
20910 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
20920 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   list of functio
20930 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  n arguments to t
20940 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79  he SrcList entry
20950 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d   for a.** table-
20960 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e  valued-function.
20970 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20980 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
20990 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
209a0 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c  rcList *p, ExprL
209b0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
209c0 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  f( p ){.    stru
209d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
209e0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
209f0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
20a00 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20a10 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
20a20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
20a30 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
20a40 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
20a50 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
20a60 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
20a70 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46      pItem->u1.pF
20a80 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a  uncArg = pList;.
20a90 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
20aa0 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d  TabFunc = 1;.  }
20ab0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
20ac0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
20ad0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
20ae0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
20af0 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
20b00 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
20b10 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
20b20 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
20b30 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
20b40 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
20b50 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
20b60 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
20b70 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
20b80 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
20b90 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
20ba0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
20bb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
20bc0 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
20bd0 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
20be0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
20bf0 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
20c00 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
20c10 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
20c20 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
20c30 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
20c40 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
20c50 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
20c60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
20c70 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
20c80 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
20c90 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
20ca0 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
20cb0 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
20cc0 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
20cd0 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
20ce0 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
20cf0 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
20d00 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
20d10 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
20d20 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
20d30 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
20d40 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
20d50 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
20d60 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
20d70 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
20d80 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
20d90 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
20da0 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66  .      p->a[i].f
20db0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  g.jointype = p->
20dc0 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  a[i-1].fg.jointy
20dd0 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
20de0 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[0].fg.jointyp
20df0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
20e00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
20e10 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47  E code for a BEG
20e20 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IN statement..*/
20e30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
20e40 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
20e50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
20e60 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
20e70 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
20e80 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
20e90 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20ea0 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
20eb0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
20ec0 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
20ed0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
20ee0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
20ef0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
20f00 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IN", 0, 0) ){.  
20f10 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
20f20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20f30 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
20f40 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
20f50 20 69 66 28 20 74 79 70 65 3d 3d 54 4b 5f 49 4d   if( type==TK_IM
20f60 4d 45 44 49 41 54 45 20 7c 7c 20 74 79 70 65 3d  MEDIATE || type=
20f70 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  =TK_EXCLUSIVE ){
20f80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20f90 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
20fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20fb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
20fc0 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
20fd0 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
20fe0 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
20ff0 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
21000 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
21010 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
21020 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp3(v, OP_Auto
21030 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 28 74  Commit, 0, 0, (t
21040 79 70 65 3d 3d 54 4b 5f 43 4f 4e 43 55 52 52 45  ype==TK_CONCURRE
21050 4e 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  NT));.}../*.** G
21060 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
21070 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f  e for a COMMIT o
21080 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65  r ROLLBACK state
21090 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f  ment..** Code fo
210a0 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65  r ROLLBACK is ge
210b0 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65  nerated if eType
210c0 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20  ==TK_ROLLBACK.  
210d0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64  Otherwise.** cod
210e0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
210f0 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a  or a COMMIT..*/.
21100 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
21110 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
21120 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54   *pParse, int eT
21130 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ype){.  Vdbe *v;
21140 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63  .  int isRollbac
21150 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  k;..  assert( pP
21160 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
21170 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
21180 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
21190 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54  eType==TK_COMMIT
211a0 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e   || eType==TK_EN
211b0 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  D || eType==TK_R
211c0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52  OLLBACK );.  isR
211d0 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d  ollback = eType=
211e0 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  =TK_ROLLBACK;.  
211f0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
21200 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
21210 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
21220 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62   .       isRollb
21230 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22  ack ? "ROLLBACK"
21240 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20   : "COMMIT", 0, 
21250 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
21260 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
21270 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
21280 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
21290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
212a0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
212b0 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c  ommit, 1, isRoll
212c0 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  back);.  }.}../*
212d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
212e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
212f0 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
21300 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
21310 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
21320 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
21330 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
21340 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
21350 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
21360 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21370 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
21380 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
21390 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
213a0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
213b0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
213c0 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
213d0 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
213e0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
213f0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
21400 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
21410 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
21420 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
21430 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
21440 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
21450 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
21460 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
21470 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
21480 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
21490 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
214a0 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
214b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
214c0 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
214d0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
214e0 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
214f0 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
21500 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
21510 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
21520 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
21530 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
21540 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
21550 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
21560 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
21570 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
21580 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
21590 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
215a0 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
215b0 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
215c0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
215d0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
215e0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
215f0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
21600 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
21610 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
21620 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21630 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
21640 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
21650 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
21660 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
21670 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
21680 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
21690 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
216a0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
216b0 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
216c0 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
216d0 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
216e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
216f0 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
21700 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
21710 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
21720 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
21730 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
21740 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
21750 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
21760 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21770 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
21780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21790 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
217a0 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
217b0 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
217c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
217d0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
217e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
217f0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
21800 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
21810 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
21820 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
21830 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
21840 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
21850 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
21860 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21870 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
21880 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
21890 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
218a0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
218b0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
218c0 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
218d0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
218e0 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
218f0 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
21900 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
21910 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
21920 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
21930 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
21940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
21950 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
21960 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
21970 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
21980 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
21990 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
219a0 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
219b0 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
219c0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
219d0 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
219e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
219f0 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
21a00 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
21a10 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
21a20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
21a30 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
21a40 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
21a50 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
21a60 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
21a70 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
21a80 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
21a90 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
21aa0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  );..  assert( iD
21ab0 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
21ac0 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
21ad0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
21ae0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  >db->aDb[iDb].pB
21af0 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
21b00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
21b10 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
21b20 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  HED+2 );.  asser
21b30 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
21b40 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65  MutexHeld(pParse
21b50 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  ->db, iDb, 0) );
21b60 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73  .  if( DbMaskTes
21b70 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
21b80 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
21b90 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
21ba0 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
21bb0 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  kieMask, iDb);. 
21bc0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
21bd0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
21be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
21bf0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
21c00 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  Toplevel);.    }
21c10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
21c20 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73   argument zDb is
21c30 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c   NULL, then call
21c40 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
21c50 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65  fySchema() for e
21c60 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  ach .** attached
21c70 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72   database. Other
21c80 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20  wise, invoke it 
21c90 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
21ca0 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e   named zDb only.
21cb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21cc0 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
21cd0 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
21ce0 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
21cf0 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  *zDb){.  sqlite3
21d00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
21d10 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  b;.  int i;.  fo
21d20 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
21d30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
21d40 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
21d50 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
21d60 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20  pBt && (!zDb || 
21d70 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
21d80 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53  p(zDb, pDb->zDbS
21d90 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
21da0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
21db0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
21dc0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
21dd0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
21de0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
21df0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
21e00 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
21e10 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
21e20 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
21e30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21e40 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
21e50 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
21e60 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
21e70 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
21e80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
21e90 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
21ea0 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
21eb0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
21ec0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
21ed0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
21ee0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
21ef0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
21f00 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
21f10 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
21f20 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
21f30 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
21f40 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
21f50 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
21f60 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
21f70 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
21f80 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
21f90 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
21fa0 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
21fb0 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
21fc0 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
21fd0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
21fe0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
21ff0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
22000 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
22010 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
22020 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
22030 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
22040 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
22050 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
22060 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
22070 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
22080 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
22090 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
220a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
220b0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
220c0 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
220d0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
220e0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
220f0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
22100 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
22110 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
22120 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54  ;.  DbMaskSet(pT
22130 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61  oplevel->writeMa
22140 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70  sk, iDb);.  pTop
22150 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
22160 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
22170 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
22180 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
22190 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
221a0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
221b0 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
221c0 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
221d0 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
221e0 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
221f0 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
22200 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
22210 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
22220 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
22230 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
22240 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
22250 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
22260 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
22270 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
22280 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
22290 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
222a0 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
222b0 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
222c0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
222d0 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
222e0 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
222f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
22300 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
22310 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
22320 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
22330 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
22340 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
22350 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
22360 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
22370 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
22380 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
22390 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
223a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
223b0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
223c0 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
223d0 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
223e0 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
223f0 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
22400 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
22410 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
22420 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
22430 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
22440 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
22450 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
22460 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
22470 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
22480 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
22490 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
224a0 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
224b0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
224c0 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
224d0 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
224e0 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
224f0 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
22500 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
22510 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
22520 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
22530 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
22540 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
22550 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
22560 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
22570 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
22580 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
22590 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
225a0 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
225b0 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
225c0 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
225d0 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
225e0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
225f0 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
22600 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
22610 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
22620 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
22630 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
22640 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
22650 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
22660 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
22670 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
22680 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
22690 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
226a0 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
226b0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
226c0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
226d0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
226e0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
226f0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
22700 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
22710 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
22720 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
22730 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
22740 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
22750 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
22760 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
22770 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
22780 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
22790 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
227a0 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
227b0 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
227c0 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
227d0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
227e0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
227f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22800 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
22810 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
22820 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
22830 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
22840 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
22850 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
22860 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
22870 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
22880 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
22890 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
228a0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
228b0 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70  essage */.  i8 p
228c0 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a  4type,        /*
228d0 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
228e0 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20  _TRANSIENT */.  
228f0 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20  u8 p5Errmsg     
22900 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74    /* P5_ErrMsg t
22910 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ype */.){.  Vdbe
22920 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
22930 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
22940 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65  assert( (errCode
22950 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
22960 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69  ONSTRAINT );.  i
22970 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
22980 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
22990 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
229a0 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
229b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
229c0 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65  OP_Halt, errCode
229d0 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34  , onError, 0, p4
229e0 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c  , p4type);.  sql
229f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
22a00 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d  (v, p5Errmsg);.}
22a10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
22a20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55  OP_Halt due to U
22a30 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
22a40 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
22a50 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  violation..*/.vo
22a60 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65  id sqlite3Unique
22a70 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
22a80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22a90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
22aa0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
22ab0 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
22ac0 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
22ad0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
22ae0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
22af0 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74   that triggers t
22b00 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  he constraint */
22b10 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
22b20 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72  ;.  int j;.  Str
22b30 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20  Accum errMsg;.  
22b40 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
22b50 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73  dx->pTable;..  s
22b60 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
22b70 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72  it(&errMsg, pPar
22b80 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30  se->db, 0, 0, 20
22b90 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  0);.  if( pIdx->
22ba0 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20  aColExpr ){.    
22bb0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
22bc0 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ndf(&errMsg, "in
22bd0 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
22be0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
22bf0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
22c00 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
22c10 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
22c20 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
22c30 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
22c40 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
22c50 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
22c60 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
22c70 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
22c80 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
22c90 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
22ca0 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
22cb0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
22cc0 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
22cd0 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a  &errMsg, pTab->z
22ce0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
22cf0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
22d00 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29  &errMsg, ".", 1)
22d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22d20 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65  str_appendall(&e
22d30 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
22d40 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d    }.  }.  zErr =
22d50 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
22d60 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
22d70 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
22d80 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
22d90 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b   .    IsPrimaryK
22da0 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20  eyIndex(pIdx) ? 
22db0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22dc0 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20  T_PRIMARYKEY .  
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49            : SQLI
22df0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
22e00 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f  IQUE,.    onErro
22e10 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  r, zErr, P4_DYNA
22e20 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69  MIC, P5_Constrai
22e30 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f  ntUnique);.}.../
22e40 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
22e50 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d  Halt due to non-
22e60 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f  unique rowid..*/
22e70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77  .void sqlite3Row
22e80 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  idConstraint(.  
22e90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
22ea0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
22eb0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
22ec0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
22ed0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
22ee0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  on algorithm */.
22ef0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
22f00 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
22f10 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e   with the non-un
22f20 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29  ique rowid */ .)
22f30 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
22f40 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
22f50 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
22f60 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
22f70 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
22f80 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c  se->db, "%s.%s",
22f90 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
22fc0 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
22fd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
22fe0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
22ff0 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  NT_PRIMARYKEY;. 
23000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67   }else{.    zMsg
23010 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
23020 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
23030 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e  s.rowid", pTab->
23040 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
23050 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
23060 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
23070 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
23080 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63  raint(pParse, rc
23090 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c  , onError, zMsg,
230a0 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20   P4_DYNAMIC,.   
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69       P5_Constrai
230d0 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a  ntUnique);.}../*
230e0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
230f0 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
23100 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
23110 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
23120 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
23130 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
23140 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
23150 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
23160 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
23170 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
23180 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
23190 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
231a0 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
231b0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
231c0 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
231d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
231e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
231f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
23200 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
23210 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73  Coll[i];.    ass
23220 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e  ert( z!=0 || pIn
23230 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
23240 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  <0 );.    if( pI
23250 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
23260 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  ]>=0 && 0==sqlit
23270 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
23280 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
23290 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
232a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
232b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
232c0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
232d0 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
232e0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
232f0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
23300 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
23310 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
23320 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
23330 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
23340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
23350 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
23360 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
23370 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
23380 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
23390 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
233a0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
233b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
233c0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
233d0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
233e0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
233f0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
23400 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
23410 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
23420 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
23430 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
23440 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
23450 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
23460 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
23470 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
23480 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
23490 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
234a0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
234b0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
234c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
234d0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
234e0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
234f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
23500 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
23510 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
23520 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
23530 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
23540 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
23550 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
23560 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
23570 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
23580 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
23590 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
235a0 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
235b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
235c0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
235d0 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
235e0 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
235f0 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
23600 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
23610 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
23620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
23630 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
23640 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
23670 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
23680 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23690 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
236a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
236b0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
236c0 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
236d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
236e0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
236f0 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
23700 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23720 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
23730 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73  atabase */..  as
23740 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23750 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
23760 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65  s(db) );  /* Nee
23770 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  ded for schema a
23780 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69  ccess */.  for(i
23790 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
237a0 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
237b0 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
237c0 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
237d0 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
237e0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
237f0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
23800 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
23810 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
23820 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
23830 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
23840 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
23850 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
23860 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
23870 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
23880 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
23890 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
238a0 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
238b0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
238c0 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
238f0 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
23900 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
23910 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
23920 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
23930 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
23940 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
23950 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
23960 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
23970 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
23980 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
23990 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
239a0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
239b0 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
239c0 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
239d0 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
239e0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
239f0 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
23a00 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
23a10 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
23a20 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
23a30 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
23a40 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
23a50 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
23a60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
23a70 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
23a80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23a90 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
23aa0 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
23ab0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
23ac0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
23ad0 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
23ae0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
23af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
23b00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23b10 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
23b20 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
23b30 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
23b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
23b50 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
23b60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
23b70 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
23b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
23b90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23ba0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23bc0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
23bd0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
23be0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c00 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
23c10 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
23c20 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c40 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
23c50 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
23c60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23c70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
23c80 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
23c90 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
23ca0 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
23cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
23cc0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
23cd0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
23ce0 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
23cf0 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
23d00 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
23d10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
23d20 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
23d30 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
23d40 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
23d50 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
23d60 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
23d70 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
23d80 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
23d90 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
23da0 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
23db0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
23dc0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
23dd0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
23de0 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45    }else if( NEVE
23df0 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20  R(pName2==0) || 
23e00 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
23e10 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
23e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
23e30 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
23e40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
23e50 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
23e60 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
23e70 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
23e80 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
23e90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
23ea0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
23eb0 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
23ec0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
23ed0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61  .      reindexDa
23ee0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
23ef0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  zColl);.      sq
23f00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23f10 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  zColl);.      re
23f20 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
23f30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23f40 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zColl);.  }.  
23f50 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
23f60 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
23f70 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
23f80 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
23f90 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
23fa0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
23fb0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
23fc0 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
23fd0 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
23fe0 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
23ff0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
24000 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
24010 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
24020 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
24030 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
24040 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
24050 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
24060 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
24070 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24080 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
24090 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
240a0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
240b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
240c0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
240d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
240e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
240f0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
24100 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
24110 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
24120 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
24130 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
24140 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24150 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
24160 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
24170 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
24180 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
24190 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
241a0 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  rn a KeyInfo str
241b0 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61  ucture that is a
241c0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
241d0 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a  he given Index..
241e0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
241f0 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
24200 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
24210 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75  ef() on the retu
24220 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77  rned object.** w
24230 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73  hen it has finis
24240 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f  hed using it..*/
24250 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
24260 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
24270 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
24280 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
24290 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
242a0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
242b0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70  ;.  int nKey = p
242c0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
242d0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20  KeyInfo *pKey;. 
242e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
242f0 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
24300 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  if( pIdx->uniqNo
24310 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65  tNull ){.    pKe
24320 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
24330 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
24340 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e  db, nKey, nCol-n
24350 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
24360 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
24370 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
24380 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20  arse->db, nCol, 
24390 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b  0);.  }.  if( pK
243a0 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
243b0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
243c0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
243d0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
243e0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
243f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
24400 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
24410 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
24420 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
24430 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33  = zColl==sqlite3
24440 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a  StrBINARY ? 0 :.
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
24470 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
24480 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
24490 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
244a0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
244b0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
244c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
244d0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
244e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
244f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ->rc==SQLITE_ERR
24500 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53  OR_MISSING_COLLS
24510 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  EQ );.      if( 
24520 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d  pIdx->bNoQuery==
24530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
24540 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69  Deactivate the i
24550 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20  ndex because it 
24560 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e  contains an unkn
24570 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  own collating.  
24580 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63        ** sequenc
24590 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  e.  The only way
245a0 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65   to reactive the
245b0 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c   index is to rel
245c0 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  oad the.        
245d0 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69  ** schema.  Addi
245e0 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63  ng the missing c
245f0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
24600 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74  e later does not
24610 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63  .        ** reac
24620 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20  tive the index. 
24630 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   The application
24640 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20   had the chance 
24650 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20  to register.    
24660 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69      ** the missi
24670 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  ng index using t
24680 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65  he collation-nee
24690 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46  ded callback.  F
246a0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  or.        ** si
246b0 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65  mplicity, SQLite
246c0 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74   will not give t
246d0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61  he application a
246e0 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a   second chance..
246f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24700 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72     pIdx->bNoQuer
24710 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
24720 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
24730 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a  TE_ERROR_RETRY;.
24740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
24750 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
24760 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
24770 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
24780 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
24790 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
247a0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
247b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
247c0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
247d0 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
247e0 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
247f0 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
24800 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
24810 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
24820 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24830 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
24840 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24850 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
24860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
24870 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
24880 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
24890 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
248a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
248b0 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
248c0 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
248d0 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
248e0 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
248f0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
24900 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
24910 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
24920 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
24930 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
24940 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
24950 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
24960 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24970 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
24980 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
24990 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
249a0 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
249b0 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
249c0 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
249d0 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
249e0 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
249f0 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
24a00 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
24a10 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
24a20 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
24a30 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
24a40 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
24a50 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
24a60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
24a70 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
24a80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24a90 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
24aa0 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
24ab0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
24ac0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24ad0 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
24ae0 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
24af0 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
24b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24b10 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
24b20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
24b30 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  e = sizeof(*pWit
24b40 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69  h) + (sizeof(pWi
24b50 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74  th->a[1]) * pWit
24b60 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e  h->nCte);.    pN
24b70 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
24b80 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c  alloc(db, pWith,
24b90 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
24ba0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  {.    pNew = sql
24bb0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
24bc0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69  (db, sizeof(*pWi
24bd0 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  th));.  }.  asse
24be0 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20  rt( (pNew!=0 && 
24bf0 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d  zName!=0) || db-
24c00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
24c10 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
24c20 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
24c30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
24c40 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
24c50 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
24c60 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
24c70 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
24c80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24c90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
24ca0 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
24cb0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
24cc0 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
24cd0 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
24ce0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
24cf0 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
24d00 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
24d10 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
24d20 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
24d30 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
24d40 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20  nCte].zCteErr = 
24d50 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
24d60 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
24d70 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
24d80 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
24d90 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
24da0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
24db0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
24dc0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
24dd0 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
24de0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
24df0 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
24e00 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
24e10 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
24e20 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
24e30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
24e40 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
24e50 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
24e60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
24e70 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
24e80 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
24e90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
24ea0 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
24eb0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
24ec0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24ed0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
24ee0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24ef0 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
24f00 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
24f10 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
24f20 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
24f30 0a                                               .