/ Hex Artifact Content
Login

Artifact cf832d9d6fa7699e1c6c18f73b847d3870f8089f8f16f64f3256da6f0911059a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  K );.    while( 
1ba0: 28 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20  (n--) > 0 ){.   
1bb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1bc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
1be0: 6c 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20  lags(pDb->pBt,. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  (pDb->safety_lev
1c10: 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  el & PAGER_SYNCH
1c20: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 0a 20 20 20  RONOUS_MASK).   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1c50: 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1c60: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c70: 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pDb++;.    }. 
1c80: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1c90: 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72 46  ine setAllPagerF
1ca0: 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d 6f  lags(X)  /* no-o
1cb0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
1cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75 6d  .** Return a hum
1cd0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d 65  an-readable name
1ce0: 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   for a constrain
1cf0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63 74  t resolution act
1d00: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
1d20: 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20 63  IGN_KEY.static c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69 6f  onst char *actio
1d40: 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e 29  nName(u8 action)
1d50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d60: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
1d70: 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 63   action ){.    c
1d80: 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a 20  ase OE_SetNull: 
1d90: 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e 55   zName = "SET NU
1da0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
1db0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53  k;.    case OE_S
1dc0: 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20 3d  etDflt:  zName =
1dd0: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b 20   "SET DEFAULT"; 
1de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1df0: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
1e00: 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41 44   zName = "CASCAD
1e10: 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  E";         brea
1e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  k;.    case OE_R
1e30: 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20 3d  estrict: zName =
1e40: 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20 20   "RESTRICT";    
1e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1e60: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1e70: 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43 54   zName = "NO ACT
1e80: 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20 20  ION";  .        
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ea0: 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f 45  sert( action==OE
1eb0: 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b 0a  _None ); break;.
1ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
1ed0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
1ee0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
1ef0: 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
1f00: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
1f10: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63 6f  URNALMODE_XXX co
1f20: 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69 6e  nstants.** defin
1f30: 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20 54  ed in pager.h. T
1f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f50: 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69 61  urns the associa
1f60: 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a 2a  ted lowercase.**
1f70: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e 61   journal-mode na
1f80: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
1f90: 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  r *sqlite3Journa
1fa0: 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65 4d  lModename(int eM
1fb0: 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ode){.  static c
1fc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d 6f  har * const azMo
1fd0: 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  deName[] = {.   
1fe0: 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72 73   "delete", "pers
1ff0: 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74 72  ist", "off", "tr
2000: 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72 79  uncate", "memory
2010: 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 2c  _OMIT_WAL.     ,
2030: 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20 20   "wal".#endif.  
2040: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  };.  assert( PAG
2050: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2060: 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61 73  ELETE==0 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3d  NALMODE_PERSIST=
2090: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b0: 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61 73  E_OFF==2 );.  as
20c0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20d0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20e0: 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
20f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2100: 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b 0a  DE_MEMORY==4 );.
2110: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3d  JOURNALMODE_WAL=
2130: 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
2140: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
2150: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
2160: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
2170: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
2180: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
2190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21a0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
21b0: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
21c0: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
21d0: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
21e0: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2200: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2210: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2220: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2230: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2240: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
2250: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
2260: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
2270: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
2280: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
2290: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
22c0: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
22d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
22e0: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
22f0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2300: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2310: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2320: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2330: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2340: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
2350: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
2360: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
2370: 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75 74  * Helper subrout
2380: 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20 69  ine for PRAGMA i
2390: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a 0a  ntegrity_check:.
23a0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  **.** Generate c
23b0: 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61 20  ode to output a 
23c0: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72 65  single-column re
23d0: 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61 20  sult row with a 
23e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
23f0: 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20 72  string held in r
2400: 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63 72  egister 3.  Decr
2410: 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74  ement the result
2420: 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73 74   count in regist
2430: 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c 74  er 1.** and halt
2440: 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   if the maximum 
2450: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2460: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2470: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2480: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
2490: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24a0: 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61 64  be *v){.  int ad
24b0: 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dr;.  sqlite3Vdb
24c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
24d0: 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a  sultRow, 3, 1);.
24e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
24f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2500: 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69 74  _IfPos, 1, sqlit
2510: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2520: 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56 64  r(v)+2, 1);.  Vd
2530: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2550: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
2560: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
2580: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
2590: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
25a0: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
25b0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
25c0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
25d0: 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a  ]id [= value].**
25e0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
25f0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
2600: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
2610: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
2620: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
2630: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
2640: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
2650: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2660: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
2670: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
2680: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
2690: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
26a0: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
26b0: 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69  e is "database.i
26c0: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
26d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
26e0: 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73  e.** and pId2 is
26f0: 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65   the id.  If the
2700: 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75   left side is ju
2710: 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64  st "id" then pId
2720: 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61  1 is the.** id a
2730: 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65  nd pId2 is any e
2740: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
2750: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67  void sqlite3Prag
2760: 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ma(.  Parse *pPa
2770: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
2780: 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  Id1,        /* F
2790: 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73 63  irst part of [sc
27a0: 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a  hema.]id field *
27b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c  /.  Token *pId2,
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
27d0: 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  d part of [schem
27e0: 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20  a.]id field, or 
27f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
2800: 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a  *pValue,      /*
2810: 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75   Token for <valu
2820: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2830: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20 20   int minusFlag  
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2850: 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63 65  a '-' sign prece
2860: 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29  ded <value> */.)
2870: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20  {.  char *zLeft 
2880: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2890: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28a0: 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a  -8 string <id> *
28b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  /.  char *zRight
28c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
28d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28e0: 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65  -8 string <value
28f0: 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  >, or NULL */.  
2900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
2910: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  = 0;   /* The da
2920: 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
2930: 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20   Token *pId;    
2940: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2950: 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e  er to <id> token
2960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63 6e   */.  char *aFcn
2970: 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20  tl[4];       /* 
2980: 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49  Argument to SQLI
2990: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
29a0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
29c0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66 6f  atabase index fo
29d0: 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a  r <database> */.
29e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * return value f
2a10: 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  orm SQLITE_FCNTL
2a20: 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c  _PRAGMA */.  sql
2a30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2a40: 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65  e->db;    /* The
2a50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a60: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2a70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2a80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
2a90: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
2aa0: 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a  being pragmaed *
2ab0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
2ac0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2ad0: 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72  rse);  /* Prepar
2ae0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
2af0: 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
2b00: 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f  me *pPragma;   /
2b10: 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  * The pragma */.
2b20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2b30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
2b40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76  dbeRunOnlyOnce(v
2b50: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
2b60: 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74  m = 2;..  /* Int
2b70: 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68 65  erpret the [sche
2b80: 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68 65  ma.] part of the
2b90: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
2ba0: 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20 20  t. iDb is the.  
2bb0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
2bc0: 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70 72  database this pr
2bd0: 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61 70  agma is being ap
2be0: 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e 61  plied to in db.a
2bf0: 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d  Db[]. */.  iDb =
2c00: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
2c10: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64 31  ame(pParse, pId1
2c20: 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a 20  , pId2, &pId);. 
2c30: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
2c40: 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  urn;.  pDb = &db
2c50: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f  ->aDb[iDb];..  /
2c60: 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64 61  * If the temp da
2c70: 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
2c80: 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64  explicitly named
2c90: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2ca0: 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61  .  ** pragma, ma
2cb0: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f 70  ke sure it is op
2cc0: 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  en. .  */.  if( 
2cd0: 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  iDb==1 && sqlite
2ce0: 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
2cf0: 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  e(pParse) ){.   
2d00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2d10: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 4e  zLeft = sqlite3N
2d20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2d30: 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c   pId);.  if( !zL
2d40: 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  eft ) return;.  
2d50: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
2d60: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2d70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2d80: 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29 3b   "-%T", pValue);
2d90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
2da0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e 61  ight = sqlite3Na
2db0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
2dc0: 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  pValue);.  }..  
2dd0: 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b 0a  assert( pId2 );.
2de0: 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e    zDb = pId2->n>
2df0: 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  0 ? pDb->zDbSNam
2e00: 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  e : 0;.  if( sql
2e10: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2e20: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41  arse, SQLITE_PRA
2e30: 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67  GMA, zLeft, zRig
2e40: 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ht, zDb) ){.    
2e50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
2e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20  .  }..  /* Send 
2e70: 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  an SQLITE_FCNTL_
2e80: 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74  PRAGMA file-cont
2e90: 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65 72  rol to the under
2ea0: 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63  lying VFS.  ** c
2eb0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 69  onnection.  If i
2ec0: 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
2ed0: 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  _OK, then assume
2ee0: 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20 20   that the VFS.  
2ef0: 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20 70  ** handled the p
2f00: 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72 61  ragma and genera
2f10: 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61  te a no-op prepa
2f20: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
2f30: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2f40: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32  NTATION-OF: R-12
2f50: 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65 76  238-55120 Whenev
2f60: 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61 74  er a PRAGMA stat
2f70: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
2f80: 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f  .  ** an SQLITE_
2f90: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c  FCNTL_PRAGMA fil
2fa0: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e  e control is sen
2fb0: 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73 71  t to the open sq
2fc0: 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20  lite3_file.  ** 
2fd0: 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
2fe0: 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ding to the data
2ff0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68 69  base file to whi
3000: 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20 20  ch the pragma.  
3010: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66  ** statement ref
3020: 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ers..  **.  ** I
3030: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
3040: 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38 20  : R-29875-31678 
3050: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
3060: 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
3070: 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c  _PRAGMA.  ** fil
3080: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20  e control is an 
3090: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
30a0: 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63 68  s to strings (ch
30b0: 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20 74  ar**) in which t
30c0: 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65  he.  ** second e
30d0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72  lement of the ar
30e0: 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ray is the name 
30f0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e  of the pragma an
3100: 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a 2a  d the third.  **
3110: 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
3120: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3130: 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69  pragma or NULL i
3140: 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61 73  f the pragma has
3150: 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e   no.  ** argumen
3160: 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c  t..  */.  aFcntl
3170: 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74  [0] = 0;.  aFcnt
3180: 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  l[1] = zLeft;.  
3190: 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67  aFcntl[2] = zRig
31a0: 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20  ht;.  aFcntl[3] 
31b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
31c0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
31d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
31e0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
31f0: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
3200: 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69  NTL_PRAGMA, (voi
3210: 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66  d*)aFcntl);.  if
3220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3230: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
3240: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
3250: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3260: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3270: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
3280: 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c  , aFcntl[0], SQL
3290: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
32a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
32b0: 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30  Text(v, aFcntl[0
32c0: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
32d0: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
32e0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
32f0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
3300: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
3310: 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 61  UND ){.    if( a
3320: 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  Fcntl[0] ){.    
3330: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3340: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
3350: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
3360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
3370: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  Fcntl[0]);.    }
3380: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
3390: 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  r++;.    pParse-
33a0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f  >rc = rc;.    go
33b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
33c0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
33d0: 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74 68  the pragma in th
33e0: 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a  e lookup table *
33f0: 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70 72  /.  pPragma = pr
3400: 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74  agmaLocate(zLeft
3410: 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  );.  if( pPragma
3420: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  ==0 ) goto pragm
3430: 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  a_out;..  /* Mak
3440: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
3450: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  ase schema is lo
3460: 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61 67  aded if the prag
3470: 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ma requires that
3480: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67   */.  if( (pPrag
3490: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
34a0: 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d  ragFlg_NeedSchem
34b0: 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  a)!=0 ){.    if(
34c0: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
34d0: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
34e0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
34f0: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
3500: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
3510: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72 61  mn names for pra
3520: 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72 6e  gmas that return
3530: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66   results */.  if
3540: 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  ( (pPragma->mPra
3550: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
3560: 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20  oColumns)==0 .  
3570: 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d   && ((pPragma->m
3580: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
3590: 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30  g_NoColumns1)==0
35a0: 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20   || zRight==0). 
35b0: 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67 6d   ){.    setPragm
35c0: 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d  aResultColumnNam
35d0: 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a  es(v, pPragma);.
35e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
35f0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
3600: 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65 72  e pragma handler
3610: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 50   */.  switch( pP
3620: 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 20  ragma->ePragTyp 
3630: 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ){.  .#if !defin
3640: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
3650: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26 26  AGER_PRAGMAS) &&
3660: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3670: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
3680: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
3690: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66  GMA [schema.]def
36a0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
36b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
36c0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
36d0: 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a  che_size=N.  **.
36e0: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
36f0: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
3700: 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65  current persiste
3710: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
3720: 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
3730: 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61  he size.  The va
3740: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
3750: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3760: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
3770: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
3780: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
3790: 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74  form sets both t
37a0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
37b0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
37c0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65  value and the pe
37d0: 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61  rsistent page ca
37e0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20  che size value. 
37f0: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
3800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72  .  **.  ** Older
3820: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
3830: 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74 68  ite would set th
3840: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
3850: 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e  size to a.  ** n
3860: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 74  egative number t
3870: 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63 68  o indicate synch
3880: 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65  ronous=OFF.  The
3890: 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72 6f  se days, synchro
38a0: 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77  nous.  ** is alw
38b0: 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c  ays on by defaul
38c0: 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  t regardless of 
38d0: 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65 20  the sign of the 
38e0: 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20  default cache.  
38f0: 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63 6f  ** size.  But co
3900: 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20 74  ntinue to take t
3910: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
3920: 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  e of the default
3930: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3940: 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20 63   of historical c
3950: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20  ompatibility..  
3960: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
3970: 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  p_DEFAULT_CACHE_
3980: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61 74  SIZE: {.    stat
3990: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
39a0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
39b0: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
39c0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
39d0: 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53 69  pList getCacheSi
39e0: 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
39f0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
3a00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2a            /* 0 *
3a30: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  /.      { OP_Rea
3a40: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20  dCookie,  0, 1, 
3a50: 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45 46         BTREE_DEF
3a60: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d  AULT_CACHE_SIZE}
3a70: 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  ,  /* 1 */.     
3a80: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
3a90: 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20     1, 8,        
3aa0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
3ab0: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 32  nteger,     0, 2
3ac0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3ad0: 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63 74     { OP_Subtract
3ae0: 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20  ,    1, 2,      
3af0: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
3b00: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
3b10: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
3b20: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
3b30: 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  r,     0, 1,    
3b40: 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20      0},         
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
3b70: 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
3b80: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
3b90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75  .      { OP_Resu
3ba0: 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20  ltRow,   1, 1,  
3bb0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
3bc0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  .    VdbeOp *aOp
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3be0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
3bf0: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  b);.    if( !zRi
3c00: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ght ){.      pPa
3c10: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
3c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c30: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
3c40: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
3c50: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
3c60: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
3c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c80: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
3c90: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
3ca0: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c 20  , getCacheSize, 
3cb0: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  iLn);.      if( 
3cc0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
3cd0: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
3ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f   break;.      aO
3cf0: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
3d00: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d       aOp[1].p1 =
3d10: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
3d20: 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f 44  6].p1 = SQLITE_D
3d30: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
3d40: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
3d50: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 73      int size = s
3d60: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73  qlite3AbsInt32(s
3d70: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
3d80: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
3d90: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
3da0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3db0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
3dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3dd0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
3de0: 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41 55  iDb, BTREE_DEFAU
3df0: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 73  LT_CACHE_SIZE, s
3e00: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
3e10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3e20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3e30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
3e40: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
3e50: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
3e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3e70: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
3e80: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
3e90: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
3ea0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
3eb0: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
3ec0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3ed0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 26  _PAGER_PRAGMAS &
3ee0: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  & !SQLITE_OMIT_D
3ef0: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69  EPRECATED */..#i
3f00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3f10: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
3f20: 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  GMAS).  /*.  ** 
3f30: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f40: 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  ]page_size.  ** 
3f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f60: 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  ]page_size=N.  *
3f70: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
3f80: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
3f90: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
3fa0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64  g for the.  ** d
3fb0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
3fc0: 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  e in bytes.  The
3fd0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
3fe0: 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  s the.  ** datab
3ff0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76 61  ase page size va
4000: 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  lue.  The value 
4010: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  can only be set 
4020: 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  if.  ** the data
4030: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65 74  base has not yet
4040: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a 20   been created.. 
4050: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
4060: 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a  yp_PAGE_SIZE: {.
4070: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4080: 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61   pDb->pBt;.    a
4090: 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b  ssert( pBt!=0 );
40a0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
40b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69   ){.      int si
40c0: 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74 29  ze = ALWAYS(pBt)
40d0: 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   ? sqlite3BtreeG
40e0: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 20  etPageSize(pBt) 
40f0: 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  : 0;.      retur
4100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69  nSingleInt(v, si
4110: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
4120: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20        /* Malloc 
4130: 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73 65  may fail when se
4140: 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d 73  tting the page-s
4150: 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69 73  ize, as there is
4160: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20   an internal.   
4170: 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68 61     ** buffer tha
4180: 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64 75  t the pager modu
4190: 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e 67  le resizes using
41a0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
41b0: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
41c0: 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73     db->nextPages
41d0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  ize = sqlite3Ato
41e0: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
41f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
4200: 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
4210: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
4220: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4230: 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  ,-1,0) ){.      
4240: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
4250: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t(db);.      }. 
4260: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
4270: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4280: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4290: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
42a0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
42b0: 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74  ma.]secure_delet
42c0: 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20  e=ON/OFF/FAST.  
42d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
42e0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
42f0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4300: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4310: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c  secure_delete fl
4320: 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ag.  The second 
4330: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
4340: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
4350: 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67   ** flag setting
4360: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65   and reports the
4370: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f   new value..  */
4380: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4390: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b  SECURE_DELETE: {
43a0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
43b0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
43c0: 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20  int b = -1;.    
43d0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
43e0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
43f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
4400: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 52  lite3_stricmp(zR
4410: 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d 30  ight, "fast")==0
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   ){.        b = 
4430: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
4440: 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69          b = sqli
4450: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
4460: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
4470: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4480: 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e  pId2->n==0 && b>
4490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
44a0: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
44b0: 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
44c0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
44d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
44e0: 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b  eDelete(db->aDb[
44f0: 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20  ii].pBt, b);.   
4500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
4510: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
4520: 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c  ecureDelete(pBt,
4530: 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53   b);.    returnS
4540: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a  ingleInt(v, b);.
4550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4560: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
4580: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  age_count.  **  
4590: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
45a0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
45b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
45c0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
45d0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
45e0: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
45f0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
4600: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4610: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
4620: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
4630: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
4640: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
4650: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
4660: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
4670: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4680: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
4690: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
46a0: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
46b0: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
46c0: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
46d0: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
46e0: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
46f0: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
4700: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
4710: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
4720: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
4730: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
4740: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4750: 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a  .]page_count.  *
4760: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
4770: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
4780: 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
4790: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
47a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
47b0: 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  _PAGE_COUNT: {. 
47c0: 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20     int iReg;.   
47d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
47e0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
47f0: 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20   iDb);.    iReg 
4800: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4810: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4820: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
4830: 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  ])=='p' ){.     
4840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4850: 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75  p2(v, OP_Pagecou
4860: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a  nt, iDb, iReg);.
4870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4890: 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e  p3(v, OP_MaxPgcn
48a0: 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20  t, iDb, iReg, . 
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
48d0: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
48e0: 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20  oi(zRight)));.  
48f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
4900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4910: 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c  ResultRow, iReg,
4920: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
4930: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4940: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4950: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
4960: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4970: 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  a.]locking_mode 
4980: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
4990: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
49a0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
49b0: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
49c0: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
49d0: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
49e0: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
49f0: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
4a00: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
4a10: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
4a20: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4a30: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
4a40: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
4a50: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
4a60: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
4a70: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
4a80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
4a90: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
4aa0: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4ab0: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4ac0: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4ad0: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4ae0: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4af0: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4b00: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4b10: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4b40: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
4b50: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
4b60: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
4b70: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
4b80: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
4b90: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
4ba0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4bb0: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4bc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4bd0: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4be0: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4bf0: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4c00: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4c10: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4c20: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4c30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4c40: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
4c50: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
4c60: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
4c70: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
4c80: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
4c90: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
4ca0: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4cb0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4cc0: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4cd0: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4ce0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4cf0: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4d00: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4d10: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4d20: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4d30: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4d40: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
4d50: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
4d60: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
4d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d80: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
4d90: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
4da0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4db0: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4dc0: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4dd0: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4de0: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4df0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4e00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4e10: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4e20: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4e30: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4e40: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4e80: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4e90: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4ea0: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4eb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4ec0: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4ed0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4ee0: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4ef0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4f00: 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74  ngleText(v, zRet
4f10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4f20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4f30: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f40: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20  urnal_mode.  ** 
4f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4f60: 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a  ]journal_mode =.
4f70: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
4f80: 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74            (delet
4f90: 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72  e|persist|off|tr
4fa0: 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61  uncate|memory|wa
4fb0: 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61  l|off).  */.  ca
4fc0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
4fd0: 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69  AL_MODE: {.    i
4fe0: 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt eMode;       
4ff0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
5000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
5010: 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  _XXX symbols */.
5020: 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
5030: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5040: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66  unter */..    if
5050: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
5060: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
5070: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
5080: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
5090: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
50a0: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
50b0: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
50c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
50d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
50e0: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
50f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5100: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
5110: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5120: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
5130: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
5140: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
5150: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
5160: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
5170: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
5180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5190: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
51a0: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
51b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
51c0: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
51d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
51e0: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
51f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
5200: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
5210: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
5220: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
5230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
5240: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
5250: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
5260: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5270: 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  f( eMode==PAGER_
5280: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5290: 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20  Y && pId2->n==0 
52a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ){.      /* Conv
52b0: 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ert "PRAGMA jour
52c0: 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22  nal_mode" into "
52d0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
52e0: 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20  nal_mode" */.   
52f0: 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20     iDb = 0;.    
5300: 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20    pId2->n = 1;. 
5310: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
5320: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30  db->nDb-1; ii>=0
5330: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; ii--){.      i
5340: 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  f( db->aDb[ii].p
5350: 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c  Bt && (ii==iDb |
5360: 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b  | pId2->n==0) ){
5370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5380: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5390: 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71   ii);.        sq
53a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
53b0: 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  v, OP_JournalMod
53c0: 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29  e, ii, 1, eMode)
53d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
53e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
5400: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
5410: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
5420: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5430: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
5440: 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _size_limit.  **
5450: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5460: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5470: 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  imit=N.  **.  **
5480: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5490: 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f  size limit on ro
54a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
54b0: 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  iles..  */.  cas
54c0: 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41  e PragTyp_JOURNA
54d0: 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a  L_SIZE_LIMIT: {.
54e0: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
54f0: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
5500: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
5510: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
5520: 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52  = -2;.    if( zR
5530: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
5540: 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
5550: 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  64(zRight, &iLim
5560: 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  it);.      if( i
5570: 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69  Limit<-1 ) iLimi
5580: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  t = -1;.    }.  
5590: 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    iLimit = sqlit
55a0: 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
55b0: 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20  zeLimit(pPager, 
55c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74  iLimit);.    ret
55d0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
55e0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65  iLimit);.    bre
55f0: 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20  ak;.  }..#endif 
5600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
5610: 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  AGER_PRAGMAS */.
5620: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
5630: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f  MA [schema.]auto
5640: 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52  _vacuum.  **  PR
5650: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75  AGMA [schema.]au
5660: 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a  to_vacuum=N.  **
5670: 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74  .  ** Get or set
5680: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5690: 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74 6f  e database 'auto
56a0: 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74  -vacuum' paramet
56b0: 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  er..  ** The val
56c0: 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30  ue is one of:  0
56d0: 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49   NONE 1 FULL 2 I
56e0: 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a  NCREMENTAL.  */.
56f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5700: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
5710: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 55   case PragTyp_AU
5720: 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20  TO_VACUUM: {.   
5730: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
5740: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
5750: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
5760: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
5770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
5780: 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
5790: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
57a0: 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  uum(pBt));.    }
57b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
57c0: 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56  eAuto = getAutoV
57d0: 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20  acuum(zRight);. 
57e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41 75       assert( eAu
57f0: 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d  to>=0 && eAuto<=
5800: 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  2 );.      db->n
5810: 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38  extAutovac = (u8
5820: 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a  )eAuto;.      /*
5830: 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63   Call SetAutoVac
5840: 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69  uum() to set ini
5850: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65  tialize the inte
5860: 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20  rnal auto and.  
5870: 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75      ** incr-vacu
5880: 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69  um flags. This i
5890: 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
58a0: 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  se this connecti
58b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  on.      ** crea
58c0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
58d0: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70   file. It is imp
58e0: 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20 69  ortant that it i
58f0: 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20  s created.      
5900: 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61  ** as an auto-va
5910: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e  cuum capable db.
5920: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5930: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5940: 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70  eSetAutoVacuum(p
5950: 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20  Bt, eAuto);.    
5960: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5970: 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31  _OK && (eAuto==1
5980: 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b   || eAuto==2) ){
5990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  .        /* When
59a0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74   setting the aut
59b0: 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f  o_vacuum mode to
59c0: 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f   either "full" o
59d0: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69  r .        ** "i
59e0: 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69  ncremental", wri
59f0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
5a00: 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64  meta[6] in the d
5a10: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
5a20: 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20  ** file. Before 
5a30: 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b  writing to meta[
5a40: 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d  6], check that m
5a50: 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73  eta[3] indicates
5a60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
5a70: 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   this really is 
5a80: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  an auto-vacuum c
5a90: 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e  apable database.
5aa0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5ab0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5ac0: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
5ad0: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
5ae0: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  ;.        static
5af0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
5b00: 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b  t setMeta6[] = {
5b10: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5b20: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
5b30: 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20  0,         1,   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
5b50: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
5b60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
5b70: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20  Cookie,     0,  
5b80: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5b90: 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f    BTREE_LARGEST_
5ba0: 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20  ROOT_PAGE},.    
5bb0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20        { OP_If,  
5bc0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
5bd0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
5be0: 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20           0},    
5bf0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 2 */.        
5c00: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
5c10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
5c20: 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20  , OE_Abort,     
5c30: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33       0},    /* 3
5c40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
5c50: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
5c60: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42 54     0,         BT
5c70: 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c  REE_INCR_VACUUM,
5c80: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
5c90: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
5ca0: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
5cb0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
5cc0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
5cd0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5cf0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5d00: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
5d10: 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29  ySize(setMeta6))
5d20: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20  ;.        aOp = 
5d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d40: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
5d50: 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74  e(setMeta6), set
5d60: 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20  Meta6, iLn);.   
5d70: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
5d80: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
5d90: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
5da0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
5db0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5dc0: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
5dd0: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  b;.        aOp[2
5de0: 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a  ].p2 = iAddr+4;.
5df0: 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70          aOp[4].p
5e00: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20  1 = iDb;.       
5e10: 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75   aOp[4].p3 = eAu
5e20: 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  to - 1;.        
5e30: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5e40: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
5e50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5e60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
5e70: 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  f..  /*.  **  PR
5e80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e  AGMA [schema.]in
5e90: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
5ea0: 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f  (N).  **.  ** Do
5eb0: 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72   N steps of incr
5ec0: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e  emental vacuumin
5ed0: 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e  g on a database.
5ee0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
5ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5f00: 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67  CUUM.  case Prag
5f10: 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f  Typ_INCREMENTAL_
5f20: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e  VACUUM: {.    in
5f30: 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a  t iLimit, addr;.
5f40: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d      if( zRight==
5f50: 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74  0 || !sqlite3Get
5f60: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69  Int32(zRight, &i
5f70: 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74  Limit) || iLimit
5f80: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  <=0 ){.      iLi
5f90: 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66 66  mit = 0x7fffffff
5fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5fb0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
5fc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
5fd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
5fe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ff0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69   OP_Integer, iLi
6000: 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  mit, 1);.    add
6010: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6020: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72  ddOp1(v, OP_Incr
6030: 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64  Vacuum, iDb); Vd
6040: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6060: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp1(v, OP_Resul
6070: 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71  tRow, 1);.    sq
6080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6090: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
60a0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
60b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
60c0: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72  P_IfPos, 1, addr
60d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
60e0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
60f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
6100: 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ddr);.    break;
6110: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
6120: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6130: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20  _PAGER_PRAGMAS. 
6140: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
6150: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6160: 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
6190: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
61a0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
61b0: 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69  rent local setti
61c0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
61d0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
61e0: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
61f0: 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
6200: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6210: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20  size value.  If 
6220: 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68  N is positive th
6230: 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  en that is the. 
6240: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6250: 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
6260: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6270: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ive, then the.  
6280: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6290: 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73  es is adjusted s
62a0: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
62b0: 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74   uses -N kibibyt
62c0: 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72  es.  ** of memor
62d0: 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  y..  */.  case P
62e0: 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a  ragTyp_CACHE_SIZ
62f0: 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E: {.    assert(
6300: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
6310: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
6320: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21   0) );.    if( !
6330: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
6340: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
6350: 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  v, pDb->pSchema-
6360: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
6370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6380: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
6390: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
63a0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
63b0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  a->cache_size = 
63c0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
63d0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
63e0: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
63f0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
6400: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
6410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6420: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6430: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6440: 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41  _spill.  **  PRA
6450: 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  GMA cache_spill=
6460: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52  BOOLEAN.  **  PR
6470: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61  AGMA [schema.]ca
6480: 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a  che_spill=N.  **
6490: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
64a0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
64b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
64c0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
64d0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
64e0: 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73  pill size. The s
64f0: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73  econd form turns
6500: 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a   cache spill on.
6510: 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68    ** or off.  Wh
6520: 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68  en turnning cach
6530: 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20  e spill on, the 
6540: 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
6550: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
6560: 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65  cache_size.  The
6570: 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73   third form sets
6580: 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68   a spill size th
6590: 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64  at.  ** may be d
65a0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68  ifferent form th
65b0: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  e cache size..  
65c0: 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74  ** If N is posit
65d0: 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69 73  ive then that is
65e0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
65f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6600: 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73   cache.  If N is
6610: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
6620: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
6630: 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a 75  of pages is adju
6640: 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  sted so that the
6650: 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b   cache uses -N k
6660: 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66  ibibytes.  ** of
6670: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20   memory..  **.  
6680: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
6690: 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20   of cache_spill 
66a0: 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74 68  pages is less th
66b0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
66c0: 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65  .  ** cache_size
66d0: 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c   pages, no spill
66e0: 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c  ing occurs until
66f0: 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20   the page count 
6700: 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65  exceeds.  ** the
6710: 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
6720: 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a  _size pages..  *
6730: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65  *.  ** The cache
6740: 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73  _spill=BOOLEAN s
6750: 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74  etting applies t
6760: 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73  o all attached s
6770: 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74  chemas,.  ** not
6780: 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d 61   just the schema
6790: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f   specified..  */
67a0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
67b0: 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20  CACHE_SPILL: {. 
67c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
67d0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
67e0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
67f0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
6800: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6810: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20  SingleInt(v,.   
6820: 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73        (db->flags
6830: 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   & SQLITE_CacheS
6840: 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a  pill)==0 ? 0 : .
6850: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6860: 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
6870: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29  Size(pDb->pBt,0)
6880: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6890: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31      int size = 1
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
68b0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67  te3GetInt32(zRig
68c0: 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20  ht, &size) ){.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
68e0: 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70  eeSetSpillSize(p
68f0: 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a  Db->pBt, size);.
6900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6910: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
6920: 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65  ean(zRight, size
6930: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
6940: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
6950: 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a  ITE_CacheSpill;.
6960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6970: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
6980: 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65 53  = ~SQLITE_CacheS
6990: 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pill;.      }.  
69a0: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
69b0: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
69c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
69d0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
69e0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f  A [schema.]mmap_
69f0: 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a  size(N).  **.  *
6a00: 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61  * Used to set ma
6a10: 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74  pping size limit
6a20: 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69  . The mapping si
6a30: 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a  ze limit is.  **
6a40: 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74   used to limit t
6a50: 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a  he aggregate siz
6a60: 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  e of all memory 
6a70: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f  mapped regions o
6a80: 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  f the.  ** datab
6a90: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69  ase file. If thi
6aa0: 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  s parameter is s
6ab0: 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  et to zero, then
6ac0: 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a   memory mapping.
6ad0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
6ae0: 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69   at all.  If N i
6af0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6b00: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d   the default mem
6b10: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d  ory map.  ** lim
6b20: 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  it determined by
6b30: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
6b40: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
6b50: 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e  AP_SIZE) is set.
6b60: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  .  ** The parame
6b70: 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65  ter N is measure
6b80: 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a  d in bytes..  **
6b90: 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65  .  ** This value
6ba0: 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
6bb0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
6bc0: 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d  S is free to mem
6bd0: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20  ory map.  ** as 
6be0: 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63  little or as muc
6bf0: 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20  h as it wants.  
6c00: 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20  Except, if N is 
6c10: 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68  set to 0 then th
6c20: 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79  e.  ** upper lay
6c30: 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69  ers will never i
6c40: 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68  nvoke the xFetch
6c50: 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74   interfaces to t
6c60: 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63  he VFS..  */.  c
6c70: 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50  ase PragTyp_MMAP
6c80: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c  _SIZE: {.    sql
6c90: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23  ite3_int64 sz;.#
6ca0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
6cb0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73  AP_SIZE>0.    as
6cc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
6cd0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
6ce0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
6cf0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
6d00: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
6d10: 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65    sqlite3DecOrHe
6d20: 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
6d30: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  sz);.      if( s
6d40: 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74  z<0 ) sz = sqlit
6d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
6d60: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28  zMmap;.      if(
6d70: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62   pId2->n==0 ) db
6d80: 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20  ->szMmap = sz;. 
6d90: 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e       for(ii=db->
6da0: 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69  nDb-1; ii>=0; ii
6db0: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
6dc0: 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74   db->aDb[ii].pBt
6dd0: 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20   && (ii==iDb || 
6de0: 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20  pId2->n==0) ){. 
6df0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6e00: 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
6e10: 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  t(db->aDb[ii].pB
6e20: 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  t, sz);.        
6e30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6e40: 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20      sz = -1;.   
6e50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
6e60: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
6e70: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
6e80: 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
6e90: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d  ;.#else.    sz =
6ea0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
6eb0: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20  ITE_OK;.#endif. 
6ec0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6ed0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
6ee0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
6ef0: 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   sz);.    }else 
6f00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
6f10: 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
6f20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6f30: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
6f40: 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
6f50: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6f60: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
6f70: 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a   temp_store.  **
6f80: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6f90: 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22  tore = "default"
6fa0: 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22  |"memory"|"file"
6fb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
6fc0: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
6fd0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
6fe0: 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e  temp_store flag.
6ff0: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7000: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
7010: 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
7020: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
7030: 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  k file and the d
7040: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75  efault.  ** valu
7050: 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
7060: 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
7070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
7080: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20   opened..  **.  
7090: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
70a0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
70b0: 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70  the library comp
70c0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
70d0: 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64   to.  ** overrid
70e0: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20  e this setting. 
70f0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7100: 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b  yp_TEMP_STORE: {
7110: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
7120: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7130: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d  SingleInt(v, db-
7140: 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20  >temp_store);.  
7150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
7160: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
7170: 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29  (pParse, zRight)
7180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
7190: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
71a0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
71b0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a  store_directory.
71c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
71d0: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
71e0: 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f  ry = ""|"directo
71f0: 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20  ry_name".  **.  
7200: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
7210: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7220: 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f   of the temp_sto
7230: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61  re_directory fla
7240: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7250: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7260: 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65   a specific dire
7270: 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64  ctory to be used
7280: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
7290: 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69  iles..  ** Setti
72a0: 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72  ng to a null str
72b0: 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20 74  ing reverts to t
72c0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f  he default tempo
72d0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73  rary directory s
72e0: 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74  earch..  ** If t
72f0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
7300: 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ry is changed, t
7310: 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65  hen invalidateTe
7320: 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a  mpStorage..  **.
7330: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7340: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44  Typ_TEMP_STORE_D
7350: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7360: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7370: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7380: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7390: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
73a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
73b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
73c0: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
73d0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
73e0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
73f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7400: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
7410: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
7420: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
7430: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
7440: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7450: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7460: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7470: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7480: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7490: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
74a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
74b0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
74c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
74d0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
74e0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20  TEMP_STORE==0.  
74f0: 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f       || (SQLITE_
7500: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26  TEMP_STORE==1 &&
7510: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c   db->temp_store<
7520: 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53  =1).       || (S
7530: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7540: 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f  ==2 && db->temp_
7550: 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20  store==1).      
7560: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
7570: 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65  idateTempStorage
7580: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7590: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
75a0: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d  free(sqlite3_tem
75b0: 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
75c0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
75d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
75e0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
75f0: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
7600: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
7610: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
7620: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7630: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7650: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7660: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7670: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7680: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7690: 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  IN.  /*.  **   P
76a0: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
76b0: 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20  _directory.  ** 
76c0: 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74    PRAGMA data_st
76d0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
76e0: 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61  ""|"directory_na
76f0: 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  me".  **.  ** Re
7700: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7710: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
7720: 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  he data_store_di
7730: 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43  rectory flag.  C
7740: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7750: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
7760: 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79  ecific directory
7770: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7780: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74  database files t
7790: 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70  hat.  ** were sp
77a0: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72  ecified with a r
77b0: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
77c0: 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20  .  Setting to a 
77d0: 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65  null string reve
77e0: 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  rts.  ** to the 
77f0: 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73 65  default database
7800: 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63   directory, whic
7810: 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  h for database f
7820: 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77  iles specified w
7830: 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74  ith.  ** a relat
7840: 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72  ive path will pr
7850: 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64 20  obably be based 
7860: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  on the current d
7870: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
7880: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20  .  ** process.  
7890: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 70  Database file sp
78a0: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e 20  ecified with an 
78b0: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72  absolute path ar
78c0: 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20  e not impacted. 
78d0: 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74 74   ** by this sett
78e0: 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ing, regardless 
78f0: 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20  of its value..  
7900: 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  **.  */.  case P
7910: 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52  ragTyp_DATA_STOR
7920: 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20  E_DIRECTORY: {. 
7930: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7940: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
7950: 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69  ngleText(v, sqli
7960: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
7970: 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ry);.    }else{.
7980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7990: 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66  MIT_WSD.      if
79a0: 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20  ( zRight[0] ){. 
79b0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
79c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
79d0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d  ite3OsAccess(db-
79e0: 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53  >pVfs, zRight, S
79f0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
7a00: 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20  DWRITE, &res);. 
7a10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
7a20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d  QLITE_OK || res=
7a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7a40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7a50: 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77  pParse, "not a w
7a60: 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72  ritable director
7a70: 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  y");.          g
7a80: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
7a90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7aa0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
7ab0: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74  free(sqlite3_dat
7ac0: 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  a_directory);.  
7ad0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
7ae0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
7af0: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7b00: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
7b10: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
7b20: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
7b30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7b40: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7b50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7b60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7b70: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7b80: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7b90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
7ba0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
7bb0: 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a  G_STYLE.  /*.  *
7bc0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
7bd0: 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  ma.]lock_proxy_f
7be0: 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ile.  **   PRAGM
7bf0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f  A [schema.]lock_
7c00: 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61  proxy_file = ":a
7c10: 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65  uto:"|"lock_file
7c20: 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _path".  **.  **
7c30: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7c40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
7c50: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20  lock_proxy_file 
7c60: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7c70: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73    ** the value s
7c80: 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20 66  ets a specific f
7c90: 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20 66  ile to be used f
7ca0: 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63 65  or database acce
7cb0: 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20  ss locks..  **. 
7cc0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7cd0: 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49  yp_LOCK_PROXY_FI
7ce0: 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  LE: {.    if( !z
7cf0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50  Right ){.      P
7d00: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7d10: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7d20: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7d30: 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69    char *proxy_fi
7d40: 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  le_path = NULL;.
7d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7d60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7d70: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7d80: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
7d90: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7da0: 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
7db0: 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
7dc0: 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  FILE, .         
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61    &proxy_file_pa
7df0: 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  th);.      retur
7e00: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70  nSingleText(v, p
7e10: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b  roxy_file_path);
7e20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7e30: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
7e40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
7e50: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
7e60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
7e70: 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
7e80: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
7e90: 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  er);.      int r
7ea0: 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  es;.      if( zR
7eb0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7ec0: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7ed0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7ee0: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7ef0: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20     zRight);.    
7f30: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
7f40: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7f50: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7f60: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7f70: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
7fb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21  }.      if( res!
7fc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7fe0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
7ff0: 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63  ailed to set loc
8000: 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a  k proxy file");.
8010: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
8020: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  gma_out;.      }
8030: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8040: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8050: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
8060: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20  CKING_STYLE */  
8070: 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20      .    .  /*. 
8080: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
8090: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
80a0: 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
80b0: 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f  [schema.]synchro
80c0: 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d  nous=OFF|ON|NORM
80d0: 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20  AL|FULL|EXTRA.  
80e0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
80f0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
8100: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e  value of the syn
8110: 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20  chronous flag.  
8120: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
8130: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
8140: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
8150: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
8160: 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a  file and the.  *
8170: 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * default value 
8180: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
8190: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
81a0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20  he database is. 
81b0: 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f   ** opened..  */
81c0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
81d0: 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20  SYNCHRONOUS: {. 
81e0: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
81f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
8200: 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e  ngleInt(v, pDb->
8210: 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b  safety_level-1);
8220: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8230: 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43    if( !db->autoC
8240: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
8250: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8260: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8270: 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c 65        "Safety le
8280: 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  vel may not be c
8290: 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20  hanged inside a 
82a0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20  transaction");. 
82b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
82c0: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db!=1 ){.       
82d0: 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67   int iLevel = (g
82e0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52  etSafetyLevel(zR
82f0: 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50  ight,0,1)+1) & P
8300: 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
8310: 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69  _MASK;.        i
8320: 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69  f( iLevel==0 ) i
8330: 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20  Level = 1;.     
8340: 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
8350: 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20  evel = iLevel;. 
8360: 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e         pDb->bSyn
8370: 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  cSet = 1;.      
8380: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
8390: 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  gs(db);.      }.
83a0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
83b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
83c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
83d0: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
83e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
83f0: 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20  _FLAG_PRAGMAS.  
8400: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41  case PragTyp_FLA
8410: 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  G: {.    if( zRi
8420: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
8430: 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43  setPragmaResultC
8440: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50  olumnNames(v, pP
8450: 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65  ragma);.      re
8460: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
8470: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50   (db->flags & pP
8480: 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20  ragma->iArg)!=0 
8490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
84a0: 20 20 20 20 75 36 34 20 6d 61 73 6b 20 3d 20 70      u64 mask = p
84b0: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20  Pragma->iArg;   
84c0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
84d0: 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72   to set or clear
84e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  . */.      if( d
84f0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
8500: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
8510: 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f  oreign key suppo
8520: 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e  rt may not be en
8530: 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65  abled or disable
8540: 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20  d while not.    
8550: 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63      ** in auto-c
8560: 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a  ommit mode.  */.
8570: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20          mask &= 
8580: 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  ~(SQLITE_Foreign
8590: 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Keys);.      }.#
85a0: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
85b0: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
85c0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68      if( db->auth
85d0: 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54  .authLevel==UAUT
85e0: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
85f0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
8600: 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72  w non-admin user
8610: 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  s to modify the 
8620: 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72 69  schema arbitrari
8630: 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  ly */.        ma
8640: 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57  sk &= ~(SQLITE_W
8650: 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20  riteSchema);.   
8660: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8670: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
8680: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
8690: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64   0) ){.        d
86a0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  b->flags |= mask
86b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
86c0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
86d0: 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
86e0: 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c     if( mask==SQL
86f0: 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64  ITE_DeferFKs ) d
8700: 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
8710: 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ons = 0;.      }
8720: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20  ..      /* Many 
8730: 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67  of the flag-prag
8740: 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63  mas modify the c
8750: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
8760: 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20   the SQL .      
8770: 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e  ** compiler (eg.
8780: 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e   count_changes).
8790: 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64   So add an opcod
87a0: 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a  e to expire all.
87b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
87c0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  d SQL statements
87d0: 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67   after modifying
87e0: 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e   a pragma value.
87f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8810: 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b  0(v, OP_Expire);
8820: 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67  .      setAllPag
8830: 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20  erFlags(db);.   
8840: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8850: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8860: 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41  TE_OMIT_FLAG_PRA
8870: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
8880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
8890: 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  EMA_PRAGMAS.  /*
88a0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
88b0: 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65  able_info(<table
88c0: 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  >).  **.  ** Ret
88d0: 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
88e0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
88f0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
8900: 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73  ble. The columns
8910: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74   of.  ** the ret
8920: 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20 61  urned data set a
8930: 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69  re:.  **.  ** ci
8940: 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  d:        Column
8950: 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72   id (numbered fr
8960: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
8970: 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30 29  , starting at 0)
8980: 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20  .  ** name:     
8990: 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20    Column name.  
89a0: 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20 43  ** type:       C
89b0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
89c0: 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74  n type..  ** not
89d0: 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66  null:    True if
89e0: 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70   'NOT NULL' is p
89f0: 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65  art of column de
8a00: 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64  claration.  ** d
8a10: 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64  flt_value: The d
8a20: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8a30: 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20   the column, if 
8a40: 61 6e 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20  any..  ** pk:   
8a50: 20 20 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66        Non-zero f
8a60: 6f 72 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20  or PK fields..  
8a70: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
8a80: 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66  p_TABLE_INFO: if
8a90: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
8aa0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
8ab0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
8ac0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
8ad0: 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c  e, LOCATE_NOERR,
8ae0: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
8af0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
8b00: 20 20 20 20 20 69 6e 74 20 69 54 61 62 44 62 20       int iTabDb 
8b10: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
8b20: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
8b30: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
8b40: 20 69 6e 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20   int i, k;.     
8b50: 20 69 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30   int nHidden = 0
8b60: 3b 0a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  ;.      Column *
8b70: 70 43 6f 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65  pCol;.      Inde
8b80: 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
8b90: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
8ba0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 50 61  pTab);.      pPa
8bb0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 37 3b 0a 20  rse->nMem = 7;. 
8bc0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
8bd0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
8be0: 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20  rse, iTabDb);.  
8bf0: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
8c00: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
8c10: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  arse, pTab);.   
8c20: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c     for(i=0, pCol
8c30: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
8c40: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
8c50: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
8c60: 20 69 6e 74 20 69 73 48 69 64 64 65 6e 20 3d 20   int isHidden = 
8c70: 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70  IsHiddenColumn(p
8c80: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Col);.        if
8c90: 28 20 69 73 48 69 64 64 65 6e 20 26 26 20 70 50  ( isHidden && pP
8ca0: 72 61 67 6d 61 2d 3e 69 41 72 67 3d 3d 30 20 29  ragma->iArg==0 )
8cb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64  {.          nHid
8cc0: 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  den++;.         
8cd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8ce0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8cf0: 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
8d00: 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
8d10: 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EY)==0 ){.      
8d20: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
8d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b     }else if( pPk
8d40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8d50: 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   k = 1;.        
8d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8d70: 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61   for(k=1; k<=pTa
8d80: 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e  b->nCol && pPk->
8d90: 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69  aiColumn[k-1]!=i
8da0: 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; k++){}.       
8db0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
8dc0: 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d  t( pCol->pDflt==
8dd0: 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  0 || pCol->pDflt
8de0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b  ->op==TK_SPAN );
8df0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8e00: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8e10: 20 31 2c 20 70 50 72 61 67 6d 61 2d 3e 69 41 72   1, pPragma->iAr
8e20: 67 20 3f 20 22 69 73 73 69 73 69 69 22 20 3a 20  g ? "issisii" : 
8e30: 22 69 73 73 69 73 69 22 2c 0a 20 20 20 20 20 20  "issisi",.      
8e40: 20 20 20 20 20 20 20 20 20 69 2d 6e 48 69 64 64           i-nHidd
8e50: 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  en,.            
8e60: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a     pCol->zName,.
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8e80: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
8e90: 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20 20  (pCol,""),.     
8ea0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8eb0: 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c  notNull ? 1 : 0,
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ed0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70 43  pCol->pDflt ? pC
8ee0: 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f  ol->pDflt->u.zTo
8ef0: 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ken : 0,.       
8f00: 20 20 20 20 20 20 20 20 6b 2c 0a 20 20 20 20 20          k,.     
8f10: 20 20 20 20 20 20 20 20 20 20 69 73 48 69 64 64            isHidd
8f20: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
8f30: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
8f40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8f50: 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61 67  EBUG.  case Prag
8f60: 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20  Typ_STATS: {.   
8f70: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8f80: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
8f90: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
8fa0: 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 5;.    sqlite3
8fb0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
8fc0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
8fd0: 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48     for(i=sqliteH
8fe0: 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
8ff0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
9000: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9010: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20  hNext(i)){.     
9020: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
9030: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
9040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9050: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9060: 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20  1, "ssiii",.    
9070: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
9080: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30  me,.           0
9090: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
90a0: 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20  b->szTabRow,.   
90b0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
90c0: 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20  owLogEst,.      
90d0: 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
90e0: 61 67 73 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ags);.      for(
90f0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
9100: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9110: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9130: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22  ultiLoad(v, 2, "
9140: 73 69 69 69 58 22 2c 0a 20 20 20 20 20 20 20 20  siiiX",.        
9150: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
9160: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9170: 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20  >szIdxRow,.     
9180: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f        pIdx->aiRo
9190: 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20  wLogEst[0],.    
91a0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73         pIdx->has
91b0: 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20  Stat1);.        
91c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
91d0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
91e0: 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20  w, 1, 5);.      
91f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9200: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63  eak;.#endif..  c
9210: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9220: 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67  X_INFO: if( zRig
9230: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
9240: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
9250: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78   *pTab;.    pIdx
9260: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
9270: 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  dex(db, zRight, 
9280: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
9290: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
92a0: 69 49 64 78 44 62 20 3d 20 73 71 6c 69 74 65 33  iIdxDb = sqlite3
92b0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
92c0: 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29  , pIdx->pSchema)
92d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
92e0: 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20       int mx;.   
92f0: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9300: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9310: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
9320: 78 69 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72  xinfo (newer ver
9330: 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72  sion with more r
9340: 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29  ows and columns)
9350: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d   */.        mx =
9360: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
9370: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9380: 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20  nMem = 6;.      
9390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
93a0: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69  * PRAGMA index_i
93b0: 6e 66 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73  nfo (legacy vers
93c0: 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion) */.        
93d0: 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mx = pIdx->nKeyC
93e0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ol;.        pPar
93f0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20  se->nMem = 3;.  
9400: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
9410: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
9420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
9430: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
9440: 50 61 72 73 65 2c 20 69 49 64 78 44 62 29 3b 0a  Parse, iIdxDb);.
9450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9460: 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61  arse->nMem<=pPra
9470: 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20  gma->nPragCName 
9480: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
9490: 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<mx; i++){.  
94a0: 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d        i16 cnum =
94b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
94c0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
94d0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
94e0: 28 76 2c 20 31 2c 20 22 69 69 73 58 22 2c 20 69  (v, 1, "iisX", i
94f0: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9510: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
9520: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
9530: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
9540: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9550: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9570: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
9580: 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iX",.           
9590: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
95a0: 72 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  r[i],.          
95b0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69    pIdx->azColl[i
95c0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ],.            i
95d0: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  <pIdx->nKeyCol);
95e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
95f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9600: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9610: 74 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d  tRow, 1, pParse-
9620: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  >nMem);.      }.
9630: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9640: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9650: 79 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69  yp_INDEX_LIST: i
9660: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9670: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9680: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9690: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54     int i;.    pT
96a0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
96b0: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
96c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
96d0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e  pTab ){.      in
96e0: 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74  t iTabDb = sqlit
96f0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
9700: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
9710: 61 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  a);.      pParse
9720: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
9730: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
9740: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
9750: 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20  , iTabDb);.     
9760: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9770: 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64  pIndex, i=0; pId
9780: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9790: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
97a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
97b0: 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63  zOrigin[] = { "c
97c0: 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a  ", "u", "pk" };.
97d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
97e0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
97f0: 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20  1, "isisi",.    
9800: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9810: 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65       pIdx->zName
9820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73 55  ,.           IsU
9830: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
9840: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f  ,.           azO
9850: 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54  rigin[pIdx->idxT
9860: 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ype],.          
9870: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
9880: 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20  here!=0);.      
9890: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
98a0: 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61  eak;..  case Pra
98b0: 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c 49  gTyp_DATABASE_LI
98c0: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
98d0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
98e0: 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28 69  m = 3;.    for(i
98f0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
9900: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
9910: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
9920: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9930: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
9940: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d  Db[i].zDbSName!=
9950: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
9960: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9970: 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20 20  v, 1, "iss",.   
9980: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
9990: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62    db->aDb[i].zDb
99a0: 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  SName,.         
99b0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
99c0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
99d0: 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a  i].pBt));.    }.
99e0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
99f0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4c  case PragTyp_COL
9a00: 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20  LATION_LIST: {. 
9a10: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
9a20: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
9a30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9a40: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73  = 2;.    for(p=s
9a50: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9a60: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70  db->aCollSeq); p
9a70: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
9a80: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43 6f  xt(p)){.      Co
9a90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
9aa0: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
9ab0: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
9ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9ad0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
9ae0: 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e  s", i++, pColl->
9af0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9b00: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64  }.  break;..#ifd
9b10: 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53  ef SQLITE_INTROS
9b20: 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a  PECTION_PRAGMAS.
9b30: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
9b40: 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a  UNCTION_LIST: {.
9b50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 48      int i;.    H
9b60: 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20  ashElem *j;.    
9b70: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20 20  FuncDef *p;.    
9b80: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
9b90: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
9ba0: 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53  <SQLITE_FUNC_HAS
9bb0: 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  H_SZ; i++){.    
9bc0: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 42    for(p=sqlite3B
9bd0: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e  uiltinFunctions.
9be0: 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e  a[i]; p; p=p->u.
9bf0: 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20  pHash ){.       
9c00: 20 69 66 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67   if( p->funcFlag
9c10: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
9c20: 49 4e 54 45 52 4e 41 4c 20 29 20 63 6f 6e 74 69  INTERNAL ) conti
9c30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
9c40: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9c50: 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d  d(v, 1, "si", p-
9c60: 3e 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  >zName, 1);.    
9c70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
9c80: 72 28 6a 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(j=sqliteHashFi
9c90: 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b  rst(&db->aFunc);
9ca0: 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68   j; j=sqliteHash
9cb0: 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20  Next(j)){.      
9cc0: 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71  p = (FuncDef*)sq
9cd0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b  liteHashData(j);
9ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9cf0: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9d00: 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65  , "si", p->zName
9d10: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
9d20: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65    break;..#ifnde
9d30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9d40: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 63 61 73  RTUALTABLE.  cas
9d50: 65 20 50 72 61 67 54 79 70 5f 4d 4f 44 55 4c 45  e PragTyp_MODULE
9d60: 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 48 61 73  _LIST: {.    Has
9d70: 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 70 50  hElem *j;.    pP
9d80: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a  arse->nMem = 1;.
9d90: 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65      for(j=sqlite
9da0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9db0: 4d 6f 64 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73 71  Module); j; j=sq
9dc0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29  liteHashNext(j))
9dd0: 7b 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  {.      Module *
9de0: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
9df0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a  sqliteHashData(j
9e00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9e10: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9e20: 20 31 2c 20 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a   1, "s", pMod->z
9e30: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
9e40: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
9e50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9e60: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
9e70: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9e80: 50 52 41 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20  PRAGMA_LIST: {. 
9e90: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
9ea0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
9eb0: 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 3b  ze(aPragmaName);
9ec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
9ed0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9ee0: 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 61 50 72  d(v, 1, "s", aPr
9ef0: 61 67 6d 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d  agmaName[i].zNam
9f00: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
9f10: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
9f20: 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
9f30: 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f  CTION_PRAGMAS */
9f40: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
9f50: 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50  TE_OMIT_SCHEMA_P
9f60: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
9f70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
9f80: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61 73  OREIGN_KEY.  cas
9f90: 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47  e PragTyp_FOREIG
9fa0: 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28 20  N_KEY_LIST: if( 
9fb0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 46 4b  zRight ){.    FK
9fc0: 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62  ey *pFK;.    Tab
9fd0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54  le *pTab;.    pT
9fe0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
9ff0: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
a000: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
a010: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 46  pTab ){.      pF
a020: 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b  K = pTab->pFKey;
a030: 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20 29  .      if( pFK )
a040: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  {.        int iT
a050: 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63  abDb = sqlite3Sc
a060: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
a070: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
a080: 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
a090: 30 3b 20 0a 20 20 20 20 20 20 20 20 70 50 61 72  0; .        pPar
a0a0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20  se->nMem = 8;.  
a0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
a0c0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
a0d0: 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20  arse, iTabDb);. 
a0e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b         while(pFK
a0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
a100: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   j;.          fo
a110: 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43  r(j=0; j<pFK->nC
a120: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
a130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a140: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
a150: 20 22 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20   "iissssss",.   
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
a180: 20 20 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20        j,.       
a190: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d              pFK-
a1a0: 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  >zTo,.          
a1b0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
a1c0: 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d  Col[pFK->aCol[j]
a1d0: 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20  .iFrom].zName,. 
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a    pFK->aCol[j].z
a200: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
a210: 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61          actionNa
a220: 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b  me(pFK->aAction[
a230: 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41  1]),  /* ON UPDA
a240: 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  TE */.          
a250: 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e           actionN
a260: 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e  ame(pFK->aAction
a270: 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c  [0]),  /* ON DEL
a280: 45 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ETE */.         
a290: 20 20 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22            "NONE"
a2a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
a2b0: 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20           ++i;.  
a2c0: 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46          pFK = pF
a2d0: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  K->pNextFrom;.  
a2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a2f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
a300: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
a310: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a320: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
a330: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
a340: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
a350: 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  EY.#ifndef SQLIT
a360: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
a370: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f   case PragTyp_FO
a380: 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a  REIGN_KEY_CHECK:
a390: 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b   {.    FKey *pFK
a3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a3b0: 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63   A foreign key c
a3c0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
a3d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
a3e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
a3f0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22   table contain "
a400: 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77  REFERENCES" keyw
a410: 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ord */.    Table
a420: 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
a430: 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c    /* Parent tabl
a440: 65 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69  e that child poi
a450: 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e  nts to */.    In
a460: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
a470: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
a480: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
a490: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  e */.    int i; 
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a  /* Loop counter:
a4c0: 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75    Foreign key nu
a4d0: 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f  mber for pTab */
a4e0: 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a500: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69  oop counter:  Fi
a510: 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69  eld of the forei
a520: 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61  gn key */.    Ha
a530: 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
a540: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a550: 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c  nter:  Next tabl
a560: 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20  e in schema */. 
a570: 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20     int x;       
a580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73            /* res
a590: 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ult variable */.
a5a0: 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c      int regResul
a5b0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  t;         /* 3 
a5c0: 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
a5d0: 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  d a result row *
a5e0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79  /.    int regKey
a5f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a600: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
a610: 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e   key for checkin
a620: 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20  g the FK */.    
a630: 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20  int regRow;     
a640: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a650: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f  ers to hold a ro
a660: 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20  w from pTab */. 
a670: 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
a680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
a690: 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b   of a loop check
a6a0: 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  ing foreign keys
a6b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
a6c0: 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Ok;            /
a6d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
a6e0: 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a  he key is OK */.
a6f0: 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b      int *aiCols;
a700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
a710: 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f  ild to parent co
a720: 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  lumn mapping */.
a730: 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d  .    regResult =
a740: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a750: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
a760: 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b  m += 4;.    regK
a770: 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ey = ++pParse->n
a780: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  Mem;.    regRow 
a790: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a7a0: 3b 0a 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65  ;.    k = sqlite
a7b0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
a7c0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a7d0: 3e 74 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77  >tblHash);.    w
a7e0: 68 69 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20  hile( k ){.     
a7f0: 20 69 6e 74 20 69 54 61 62 44 62 3b 0a 20 20 20   int iTabDb;.   
a800: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
a810: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
a820: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
a830: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52  le(pParse, 0, zR
a840: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
a850: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
a860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a870: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
a880: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
a890: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71  ;.        k = sq
a8a0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b  liteHashNext(k);
a8b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a8c0: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54  f( pTab==0 || pT
a8d0: 61 62 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63  ab->pFKey==0 ) c
a8e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
a8f0: 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53  TabDb = sqlite3S
a900: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
a910: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
a920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
a930: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
a940: 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a  Parse, iTabDb);.
a950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
a960: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
a970: 54 61 62 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  TabDb, pTab->tnu
a980: 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
a990: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
a9a0: 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e  ab->nCol+regRow>
a9b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70  pParse->nMem ) p
a9c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54  Parse->nMem = pT
a9d0: 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f  ab->nCol + regRo
a9e0: 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
a9f0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
aa00: 2c 20 30 2c 20 69 54 61 62 44 62 2c 20 70 54 61  , 0, iTabDb, pTa
aa10: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
aa20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa30: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
aa40: 72 65 67 52 65 73 75 6c 74 2c 20 70 54 61 62 2d  regResult, pTab-
aa50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  >zName);.      f
aa60: 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62  or(i=1, pFK=pTab
aa70: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b  ->pFKey; pFK; i+
aa80: 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78  +, pFK=pFK->pNex
aa90: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20  tFrom){.        
aaa0: 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65  pParent = sqlite
aab0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70  3FindTable(db, p
aac0: 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20  FK->zTo, zDb);. 
aad0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65         if( pPare
aae0: 6e 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  nt==0 ) continue
aaf0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d  ;.        pIdx =
ab00: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
ab10: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
ab20: 72 73 65 2c 20 69 54 61 62 44 62 2c 20 70 50 61  rse, iTabDb, pPa
ab30: 72 65 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  rent->tnum, 0, p
ab40: 50 61 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a  Parent->zName);.
ab50: 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
ab60: 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78  te3FkLocateIndex
ab70: 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
ab80: 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29  , pFK, &pIdx, 0)
ab90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3d  ;.        if( x=
aba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
abb0: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20  if( pIdx==0 ){. 
abc0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
abd0: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
abe0: 73 65 2c 20 69 2c 20 69 54 61 62 44 62 2c 20 70  se, i, iTabDb, p
abf0: 50 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52  Parent, OP_OpenR
ac00: 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ead);.          
ac10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ac20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ac30: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
ac40: 65 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e  ead, i, pIdx->tn
ac50: 75 6d 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20  um, iTabDb);.   
ac60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac70: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
ac80: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
ac90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
aca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acb0: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
acc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
acd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ace0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
acf0: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70  rse->nErr>0 || p
ad00: 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  FK==0 );.      i
ad10: 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a  f( pFK ) break;.
ad20: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
ad30: 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73  ->nTab<i ) pPars
ad40: 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20  e->nTab = i;.   
ad50: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
ad60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ad70: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b  , OP_Rewind, 0);
ad80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ad90: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c  ;.      for(i=1,
ada0: 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79   pFK=pTab->pFKey
adb0: 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d  ; pFK; i++, pFK=
adc0: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pFK->pNextFrom){
add0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74  .        pParent
ade0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
adf0: 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f  ble(db, pFK->zTo
ae00: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
ae10: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
ae20: 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20    aiCols = 0;.  
ae30: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e        if( pParen
ae40: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  t ){.          x
ae50: 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61   = sqlite3FkLoca
ae60: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
ae70: 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70  pParent, pFK, &p
ae80: 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20  Idx, &aiCols);. 
ae90: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
aea0: 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x==0 );.       
aeb0: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f   }.        addrO
aec0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
aed0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
aee0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
aef0: 65 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20 74  e code to read t
af00: 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c  he child key val
af10: 75 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ues into registe
af20: 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  rs.        ** re
af30: 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e 2e 20  gRow..regRow+n. 
af40: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63 68  If any of the ch
af50: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20 61  ild key values a
af60: 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73 20 0a 20  re NULL, this . 
af70: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 63 61         ** row ca
af80: 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e 20 46 4b  nnot cause an FK
af90: 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75 6d 70   violation. Jump
afa0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 64 64   directly to add
afb0: 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20 20 20 20  rOk in .        
afc0: 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  ** this case. */
afd0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
afe0: 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a  ; j<pFK->nCol; j
aff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
b000: 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c 73  nt iCol = aiCols
b010: 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70   ? aiCols[j] : p
b020: 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f  FK->aCol[j].iFro
b030: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  m;.          sql
b040: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
b050: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
b060: 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c 2c 20 72  pTab, 0, iCol, r
b070: 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20 20  egRow+j);.      
b080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b090: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
b0a0: 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64  ll, regRow+j, ad
b0b0: 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  drOk); VdbeCover
b0c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
b0d0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
b0e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 71  nerate code to q
b0f0: 75 65 72 79 20 74 68 65 20 70 61 72 65 6e 74 20  uery the parent 
b100: 69 6e 64 65 78 20 66 6f 72 20 61 20 6d 61 74 63  index for a matc
b110: 68 69 6e 67 20 70 61 72 65 6e 74 0a 20 20 20 20  hing parent.    
b120: 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49 66 20 61      ** key. If a
b130: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
b140: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 4f 6b 2e   jump to addrOk.
b150: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b160: 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pIdx ){.        
b170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b180: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
b190: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70 46  cord, regRow, pF
b1a0: 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79 2c  K->nCol, regKey,
b1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
b1c0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
b1d0: 69 74 79 53 74 72 28 64 62 2c 70 49 64 78 29 2c  ityStr(db,pIdx),
b1e0: 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20   pFK->nCol);.   
b1f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b200: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
b210: 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64 72  P_Found, i, addr
b220: 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a  Ok, regKey, 0);.
b230: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
b240: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b250: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
b260: 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
b270: 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73 71 6c 69    int jmp = sqli
b280: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
b290: 64 72 28 76 29 2b 32 3b 0a 20 20 20 20 20 20 20  dr(v)+2;.       
b2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
b2c0: 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c 20 72 65  owid, i, jmp, re
b2d0: 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72  gRow); VdbeCover
b2e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
b2f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
b300: 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20  o(v, addrOk);.  
b310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b320: 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b 0a  pFK->nCol==1 );.
b330: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
b340: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
b350: 6f 64 65 20 74 6f 20 72 65 70 6f 72 74 20 61 6e  ode to report an
b360: 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 20 74 6f   FK violation to
b370: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a   the caller. */.
b380: 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52          if( HasR
b390: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
b3a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b3b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b3c0: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 65 73  Rowid, 0, regRes
b3d0: 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ult+1);.        
b3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b3f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b400: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
b410: 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a  , regResult+1);.
b420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
b440: 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52 65 73  tiLoad(v, regRes
b450: 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c 20 70 46  ult+2, "siX", pF
b460: 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20 20  K->zTo, i-1);.  
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b480: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
b490: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
b4a0: 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  lt, 4);.        
b4b0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b4c0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
b4d0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
b4e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 69  te3DbFree(db, ai
b4f0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cols);.      }. 
b500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b510: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
b520: 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b 31 29  t, 0, addrTop+1)
b530: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b540: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b550: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b560: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d 0a  addrTop);.    }.
b570: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
b580: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
b590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
b5a0: 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  GER) */.#endif /
b5b0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
b5c0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
b5d0: 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EY) */..#ifndef 
b5e0: 4e 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72  NDEBUG.  case Pr
b5f0: 61 67 54 79 70 5f 50 41 52 53 45 52 5f 54 52 41  agTyp_PARSER_TRA
b600: 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  CE: {.    if( zR
b610: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66  ight ){.      if
b620: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
b630: 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29  ean(zRight, 0) )
b640: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b650: 33 50 61 72 73 65 72 54 72 61 63 65 28 73 74 64  3ParserTrace(std
b660: 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29  out, "parser: ")
b670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
b690: 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b  rserTrace(0, 0);
b6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b6b0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
b6c0: 69 66 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61  if..  /* Reinsta
b6d0: 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20  ll the LIKE and 
b6e0: 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20  GLOB functions. 
b6f0: 20 54 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20   The variant of 
b700: 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77  LIKE.  ** used w
b710: 69 6c 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73  ill be case sens
b720: 69 74 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70  itive or not dep
b730: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48  ending on the RH
b740: 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  S..  */.  case P
b750: 72 61 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53  ragTyp_CASE_SENS
b760: 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20  ITIVE_LIKE: {.  
b770: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
b780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 67        sqlite3Reg
b790: 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f  isterLikeFunctio
b7a0: 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65  ns(db, sqlite3Ge
b7b0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
b7c0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   0));.    }.  }.
b7d0: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65    break;..#ifnde
b7e0: 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  f SQLITE_INTEGRI
b7f0: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
b800: 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  AX.# define SQLI
b810: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
b820: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30 30  CK_ERROR_MAX 100
b830: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
b840: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
b850: 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20 20 2f  EGRITY_CHECK.  /
b860: 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  *    PRAGMA inte
b870: 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 2a 2a  grity_check.  **
b880: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
b890: 72 69 74 79 5f 63 68 65 63 6b 28 4e 29 0a 20 20  rity_check(N).  
b8a0: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69  **    PRAGMA qui
b8b0: 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20  ck_check.  **   
b8c0: 20 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68   PRAGMA quick_ch
b8d0: 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  eck(N).  **.  **
b8e0: 20 56 65 72 69 66 79 20 74 68 65 20 69 6e 74 65   Verify the inte
b8f0: 67 72 69 74 79 20 6f 66 20 74 68 65 20 64 61 74  grity of the dat
b900: 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  abase..  **.  **
b910: 20 54 68 65 20 22 71 75 69 63 6b 5f 63 68 65 63   The "quick_chec
b920: 6b 22 20 69 73 20 72 65 64 75 63 65 64 20 76 65  k" is reduced ve
b930: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69  rsion of .  ** i
b940: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64  ntegrity_check d
b950: 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63  esigned to detec
b960: 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20  t most database 
b970: 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20  corruption.  ** 
b980: 77 69 74 68 6f 75 74 20 74 68 65 20 6f 76 65 72  without the over
b990: 68 65 61 64 20 6f 66 20 63 72 6f 73 73 2d 63 68  head of cross-ch
b9a0: 65 63 6b 69 6e 67 20 69 6e 64 65 78 65 73 2e 20  ecking indexes. 
b9b0: 20 51 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a   Quick_check.  *
b9c0: 2a 20 69 73 20 6c 69 6e 65 61 72 20 74 69 6d 65  * is linear time
b9d0: 20 77 68 65 72 65 61 73 65 20 69 6e 74 65 67 72   wherease integr
b9e0: 69 74 79 5f 63 68 65 63 6b 20 69 73 20 4f 28 4e  ity_check is O(N
b9f0: 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  logN)..  */.  ca
ba00: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54 45 47  se PragTyp_INTEG
ba10: 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20  RITY_CHECK: {.  
ba20: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72    int i, j, addr
ba30: 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69 6e  , mxErr;..    in
ba40: 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71 6c  t isQuick = (sql
ba50: 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66  ite3Tolower(zLef
ba60: 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20  t[0])=='q');..  
ba70: 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41 47    /* If the PRAG
ba80: 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f  MA command was o
ba90: 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41 47  f the form "PRAG
baa0: 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74  MA <db>.integrit
bab0: 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a  y_check",.    **
bac0: 20 74 68 65 6e 20 69 44 62 20 69 73 20 73 65 74   then iDb is set
bad0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
bae0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 64   the database id
baf0: 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62 3e  entified by <db>
bb00: 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
bb10: 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65 67   case, the integ
bb20: 72 69 74 79 20 6f 66 20 64 61 74 61 62 61 73 65  rity of database
bb30: 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65 72   iDb only is ver
bb40: 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ified by.    ** 
bb50: 74 68 65 20 56 44 42 45 20 63 72 65 61 74 65 64  the VDBE created
bb60: 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
bb70: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
bb80: 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   if the command 
bb90: 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41 47  was simply "PRAG
bba0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
bbb0: 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22  ck" (or.    ** "
bbc0: 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65  PRAGMA quick_che
bbd0: 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20 69  ck"), then iDb i
bbe0: 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20 74  s set to 0. In t
bbf0: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 69 44  his case, set iD
bc00: 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68  b.    ** to -1 h
bc10: 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74 65  ere, to indicate
bc20: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 73   that the VDBE s
bc30: 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68 65  hould verify the
bc40: 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20 2a   integrity.    *
bc50: 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68 65  * of all attache
bc60: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a 2f  d databases.  */
bc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
bc80: 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
bc90: 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64  t( iDb==0 || pId
bca0: 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28 20  2->z );.    if( 
bcb0: 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62  pId2->z==0 ) iDb
bcc0: 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49   = -1;..    /* I
bcd0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44  nitialize the VD
bce0: 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  BE program */.  
bcf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
bd00: 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   6;..    /* Set 
bd10: 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72 72 6f  the maximum erro
bd20: 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 6d  r count */.    m
bd30: 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e  xErr = SQLITE_IN
bd40: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
bd50: 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66 28  ROR_MAX;.    if(
bd60: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
bd70: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
bd80: 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72 72 29  (zRight, &mxErr)
bd90: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 45 72  ;.      if( mxEr
bda0: 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r<=0 ){.        
bdb0: 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49  mxErr = SQLITE_I
bdc0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
bdd0: 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20 20  RROR_MAX;.      
bde0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
bdf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
be00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78 45   OP_Integer, mxE
be10: 72 72 2d 31 2c 20 31 29 3b 20 2f 2a 20 72 65 67  rr-1, 1); /* reg
be20: 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73  [1] holds errors
be30: 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a   left */..    /*
be40: 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79   Do an integrity
be50: 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64   check on each d
be60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
be70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
be80: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
be90: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b      HashElem *x;
bea0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
beb0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
bec0: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  in the schema */
bed0: 0a 20 20 20 20 20 20 48 61 73 68 20 2a 70 54 62  .      Hash *pTb
bee0: 6c 73 3b 20 20 20 20 20 2f 2a 20 53 65 74 20 6f  ls;     /* Set o
bef0: 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
bf00: 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
bf10: 20 20 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20      int *aRoot; 
bf20: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
bf30: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
bf40: 72 73 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  rs of all btrees
bf50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   */.      int cn
bf60: 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  t = 0;     /* Nu
bf70: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
bf80: 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20  in aRoot[] */.  
bf90: 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20      int mxIdx = 
bfa0: 30 3b 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  0;   /* Maximum 
bfb0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65  number of indexe
bfc0: 73 20 66 6f 72 20 61 6e 79 20 74 61 62 6c 65 20  s for any table 
bfd0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d  */..      if( OM
bfe0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d  IT_TEMPDB && i==
bff0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
c000: 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26      if( iDb>=0 &
c010: 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69  & i!=iDb ) conti
c020: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  nue;..      sqli
c030: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
c040: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
c050: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20  .      /* Do an 
c060: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
c070: 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20  of the B-Tree.  
c080: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
c090: 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67  Begin by finding
c0a0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20   the root pages 
c0b0: 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a  numbers.      **
c0c0: 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
c0d0: 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74  and indices in t
c0e0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
c0f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
c100: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
c110: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
c120: 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54  , 0) );.      pT
c130: 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  bls = &db->aDb[i
c140: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
c150: 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  sh;.      for(cn
c160: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
c170: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
c180: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
c190: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
c1a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
c1b0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
c1c0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 61 62    /* Current tab
c1d0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  le */.        In
c1e0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70  /* An index on p
c210: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  Tab */.        i
c220: 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20 20 20  nt nIdx;        
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
c250: 64 65 78 65 73 20 6f 6e 20 70 54 61 62 20 2a 2f  dexes on pTab */
c260: 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73  .        if( Has
c270: 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 63 6e  Rowid(pTab) ) cn
c280: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t++;.        for
c290: 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d 70 54  (nIdx=0, pIdx=pT
c2a0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
c2b0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
c2c0: 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63 6e 74  xt, nIdx++){ cnt
c2d0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ++; }.        if
c2e0: 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29 20 6d  ( nIdx>mxIdx ) m
c2f0: 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20 20 20  xIdx = nIdx;.   
c300: 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74     }.      aRoot
c310: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c320: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c330: 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31 29 29  of(int)*(cnt+1))
c340: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52 6f 6f  ;.      if( aRoo
c350: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
c360: 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78      for(cnt=0, x
c370: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
c380: 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71  (pTbls); x; x=sq
c390: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29  liteHashNext(x))
c3a0: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
c3b0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c3c0: 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20  shData(x);.     
c3d0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
c3e0: 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52          if( HasR
c3f0: 6f 77 69 64 28 70 54 61 62 29 20 29 20 61 52 6f  owid(pTab) ) aRo
c400: 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 54 61 62  ot[++cnt] = pTab
c410: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
c420: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
c430: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
c440: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
c450: 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f 74 5b            aRoot[
c460: 2b 2b 63 6e 74 5d 20 3d 20 70 49 64 78 2d 3e 74  ++cnt] = pIdx->t
c470: 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  num;.        }. 
c480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f       }.      aRo
c490: 6f 74 5b 30 5d 20 3d 20 63 6e 74 3b 0a 0a 20 20  ot[0] = cnt;..  
c4a0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
c4b0: 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75 6d 62   sufficient numb
c4c0: 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
c4d0: 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
c4e0: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ted */.      pPa
c4f0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28  rse->nMem = MAX(
c500: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 38   pParse->nMem, 8
c510: 2b 6d 78 49 64 78 20 29 3b 0a 20 20 20 20 20 20  +mxIdx );.      
c520: 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
c530: 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
c540: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74  ;..      /* Do t
c550: 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72  he b-tree integr
c560: 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20  ity checks */.  
c570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c580: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp4(v, OP_Inte
c590: 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c  grityCk, 2, cnt,
c5a0: 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74   1, (char*)aRoot
c5b0: 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20  ,P4_INTARRAY);. 
c5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5d0: 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
c5e0: 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  i);.      addr =
c5f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c600: 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
c610: 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   2); VdbeCoverag
c620: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
c630: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
c640: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
c650: 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  3, 0,.         s
c660: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c670: 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61  , "*** in databa
c680: 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62  se %s ***\n", db
c690: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
c6a0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f  e),.         P4_
c6b0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
c6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c6d0: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
c6e0: 32 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  2, 3, 3);.      
c6f0: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
c700: 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20  sultRow(v);.    
c710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c720: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
c730: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
c740: 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69  ure all the indi
c750: 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63  ces are construc
c760: 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
c770: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f       */.      fo
c780: 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(x=sqliteHashFi
c790: 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78  rst(pTbls); x; x
c7a0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
c7b0: 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  x)){.        Tab
c7c0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
c7d0: 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20  eHashData(x);.  
c7e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
c7f0: 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20  x, *pPk;.       
c800: 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d   Index *pPrior =
c810: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
c820: 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20  loopTop;.       
c830: 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69   int iDataCur, i
c840: 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
c850: 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20  int r1 = -1;..  
c860: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
c870: 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75  tnum<1 ) continu
c880: 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57  e;  /* Skip VIEW
c890: 73 20 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42  s or VIRTUAL TAB
c8a0: 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  LEs */.        p
c8b0: 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54  Pk = HasRowid(pT
c8c0: 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  ab) ? 0 : sqlite
c8d0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
c8e0: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
c8f0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
c900: 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72 73  AndIndices(pPars
c910: 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  e, pTab, OP_Open
c920: 52 65 61 64 2c 20 30 2c 0a 20 20 20 20 20 20 20  Read, 0,.       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
c950: 2c 20 26 69 44 61 74 61 43 75 72 2c 20 26 69 49  , &iDataCur, &iI
c960: 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  dxCur);.        
c970: 2f 2a 20 72 65 67 5b 37 5d 20 63 6f 75 6e 74 73  /* reg[7] counts
c980: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
c990: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61  ntries in the ta
c9a0: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble..        ** 
c9b0: 72 65 67 5b 38 2b 69 5d 20 63 6f 75 6e 74 73 20  reg[8+i] counts 
c9c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
c9d0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 2d 74  tries in the i-t
c9e0: 68 20 69 6e 64 65 78 20 0a 20 20 20 20 20 20 20  h index .       
c9f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
ca00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ca10: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
ca20: 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  7);.        for(
ca30: 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  j=0, pIdx=pTab->
ca40: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
ca50: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
ca60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
ca70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ca80: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ca90: 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64   0, 8+j); /* ind
caa0: 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74  ex entries count
cab0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  er */.        }.
cac0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cad0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b  pParse->nMem>=8+
cae0: 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  j );.        ass
caf0: 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65  ert( sqlite3NoTe
cb00: 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73  mpsInRange(pPars
cb10: 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20  e,1,7+j) );.    
cb20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cb30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
cb40: 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29  nd, iDataCur, 0)
cb50: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
cb60: 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54  );.        loopT
cb70: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
cb80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
cb90: 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20  Imm, 7, 1);.    
cba0: 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63 6b      if( !isQuick
cbb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
cbc0: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20 6f 6e   Sanity check on
cbd0: 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 64   record header d
cbe0: 65 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20  ecoding */.     
cbf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cc00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
cc10: 75 6d 6e 2c 20 69 44 61 74 61 43 75 72 2c 20 70  umn, iDataCur, p
cc20: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33 29 3b  Tab->nCol-1, 3);
cc30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cc40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
cc50: 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  , OPFLAG_TYPEOFA
cc60: 52 47 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RG);.        }. 
cc70: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
cc80: 20 74 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55   that all NOT NU
cc90: 4c 4c 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c  LL columns reall
cca0: 79 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a  y are NOT NULL *
ccb0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  /.        for(j=
ccc0: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
ccd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
cce0: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
ccf0: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 3b         int jmp2;
cd00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
cd10: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20  ==pTab->iPKey ) 
cd20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
cd30: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43      if( pTab->aC
cd40: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  ol[j].notNull==0
cd50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
cd60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
cd70: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
cd80: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
cd90: 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b  iDataCur, j, 3);
cda0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cdb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
cdc0: 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  , OPFLAG_TYPEOFA
cdd0: 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  RG);.          j
cde0: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp2 = sqlite3Vdb
cdf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
ce00: 74 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43  tNull, 3); VdbeC
ce10: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
ce20: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c        zErr = sql
ce30: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
ce40: 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25  "NULL value in %
ce50: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
ce60: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e    pTab->aCol[j].
ce90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
cea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ceb0: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
cec0: 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72  8, 0, 3, 0, zErr
ced0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
cee0: 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69           integri
cef0: 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77  tyCheckResultRow
cf00: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
cf10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
cf20: 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20  re(v, jmp2);.   
cf30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
cf40: 2a 20 56 65 72 69 66 79 20 43 48 45 43 4b 20 63  * Verify CHECK c
cf50: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
cf60: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
cf70: 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66  pCheck && (db->f
cf80: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67  lags & SQLITE_Ig
cf90: 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29  noreChecks)==0 )
cfa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
cfb0: 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 73  List *pCheck = s
cfc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cfd0: 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65  p(db, pTab->pChe
cfe0: 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ck, 0);.        
cff0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
d000: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
d010: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
d020: 72 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69 74  rCkFault = sqlit
d030: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d040: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d050: 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20 73  int addrCkOk = s
d060: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d070: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
d080: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
d090: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d0a0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
d0b0: 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
d0c0: 3d 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a  = iDataCur + 1;.
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
d0e0: 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d  k=pCheck->nExpr-
d0f0: 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20  1; k>0; k--){.  
d100: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d110: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
d120: 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61  Parse, pCheck->a
d130: 5b 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43  [k].pExpr, addrC
d140: 6b 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20  kFault, 0);.    
d150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d170: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
d180: 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78  pCheck->a[0].pEx
d190: 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20  pr, addrCkOk, . 
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
d1b0: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d1d0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d1e0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b  eLabel(v, addrCk
d1f0: 46 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  Fault);.        
d200: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
d210: 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  fTab = 0;.      
d220: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c        zErr = sql
d230: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d240: 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  "CHECK constrain
d250: 74 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c  t failed in %s",
d260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d270: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
d280: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d290: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
d2a0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33  OP_String8, 0, 3
d2b0: 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  , 0, zErr, P4_DY
d2c0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
d2d0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65      integrityChe
d2e0: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a  ckResultRow(v);.
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d300: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d310: 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29  bel(v, addrCkOk)
d320: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d340: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
d350: 2c 20 70 43 68 65 63 6b 29 3b 0a 20 20 20 20 20  , pCheck);.     
d360: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d370: 20 21 69 73 51 75 69 63 6b 20 29 7b 20 2f 2a 20   !isQuick ){ /* 
d380: 4f 6d 69 74 20 74 68 65 20 72 65 6d 61 69 6e 69  Omit the remaini
d390: 6e 67 20 74 65 73 74 73 20 66 6f 72 20 71 75 69  ng tests for qui
d3a0: 63 6b 5f 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  ck_check */.    
d3b0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74        /* Validat
d3c0: 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
d3d0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
d3e0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  row */.         
d3f0: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
d400: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d410: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d420: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
d430: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c         int jmp2,
d440: 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70   jmp3, jmp4, jmp
d450: 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  5;.            i
d460: 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69  nt ckUniq = sqli
d470: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d480: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d490: 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29   if( pPk==pIdx )
d4a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d4b0: 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
d4c0: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
d4d0: 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
d4e0: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 30  , iDataCur, 0, 0
d4f0: 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20  , &jmp3,.       
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20    pPrior, r1);. 
d530: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
d540: 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  r = pIdx;.      
d550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d560: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
d570: 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f 2a  dImm, 8+j, 1);/*
d580: 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79   increment entry
d590: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   count */.      
d5a0: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
d5b0: 74 68 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  that an index en
d5c0: 74 72 79 20 65 78 69 73 74 73 20 66 6f 72 20 74  try exists for t
d5d0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
d5e0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
d5f0: 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74      jmp2 = sqlit
d600: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
d610: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64  v, OP_Found, iId
d620: 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20  xCur+j, ckUniq, 
d630: 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
d660: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62 65  ->nColumn); Vdbe
d670: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d680: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d690: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
d6a0: 2c 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20  , 3, "row ");.  
d6b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d6c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d6d0: 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20  P_Concat, 7, 3, 
d6e0: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
d6f0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
d700: 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69  tring(v, 4, " mi
d710: 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78  ssing from index
d720: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
d730: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d740: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
d750: 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   4, 3, 3);.     
d760: 20 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71         jmp5 = sq
d770: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d780: 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e  ing(v, 4, pIdx->
d790: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
d7a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d7b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63  ddOp3(v, OP_Conc
d7c0: 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20  at, 4, 3, 3);.  
d7d0: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 34 20 3d            jmp4 =
d7e0: 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52   integrityCheckR
d7f0: 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20  esultRow(v);.   
d800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d810: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d820: 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp2);.         
d830: 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55 45     /* For UNIQUE
d840: 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69 66 79   indexes, verify
d850: 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20 65   that only one e
d860: 6e 74 72 79 20 65 78 69 73 74 73 20 77 69 74 68  ntry exists with
d870: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
d880: 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e   ** current key.
d890: 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20 75    The entry is u
d8a0: 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e 79  nique if (1) any
d8b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a   column is NULL.
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
d8d0: 72 20 28 32 29 20 74 68 65 20 6e 65 78 74 20 65  r (2) the next e
d8e0: 6e 74 72 79 20 68 61 73 20 61 20 64 69 66 66 65  ntry has a diffe
d8f0: 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20  rent key */.    
d900: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 55 6e          if( IsUn
d910: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
d920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d930: 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71   int uniqOk = sq
d940: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d950: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  el(v);.         
d960: 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20       int jmp6;. 
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
d980: 20 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20   kk;.           
d990: 20 20 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c     for(kk=0; kk<
d9a0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b  pIdx->nKeyCol; k
d9b0: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
d9c0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d9d0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
d9e0: 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  kk];.           
d9f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
da00: 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69  l!=XN_ROWID && i
da10: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
da20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
da30: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
da40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
da50: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74  ].notNull ) cont
da60: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
da70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
da90: 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69  Null, r1+kk, uni
daa0: 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  qOk);.          
dab0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
dac0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
dad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
dae0: 20 20 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69       jmp6 = sqli
daf0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
db00: 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75   OP_Next, iIdxCu
db10: 72 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+j); VdbeCovera
db20: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
db30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db40: 47 6f 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b  Goto(v, uniqOk);
db50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
db60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
db70: 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20  re(v, jmp6);.   
db80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
db90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
dba0: 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64  v, OP_IdxGT, iId
dbb0: 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20  xCur+j, uniqOk, 
dbc0: 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65         pIdx->nKe
dbf0: 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
dc00: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
dc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc20: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33  eLoadString(v, 3
dc30: 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e  , "non-unique en
dc40: 74 72 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b  try in index ");
dc50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
dc60: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
dc70: 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20  , jmp5);.       
dc80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dc90: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
dca0: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
dcb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dcc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dcd0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34  JumpHere(v, jmp4
dce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
dcf0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
dd00: 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65  tIdxLabel(pParse
dd10: 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20  , jmp3);.       
dd20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
dd30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dd40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
dd50: 65 78 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c  ext, iDataCur, l
dd60: 6f 6f 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76  oopTop); VdbeCov
dd70: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
dd80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
dd90: 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70  pHere(v, loopTop
dda0: 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  -1);.#ifndef SQL
ddb0: 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
ddc0: 55 4e 54 0a 20 20 20 20 20 20 20 20 69 66 28 20  UNT.        if( 
ddd0: 21 69 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20  !isQuick ){.    
dde0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ddf0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32  eLoadString(v, 2
de00: 2c 20 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e  , "wrong # of en
de10: 74 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22  tries in index "
de20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
de30: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
de40: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
de50: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
de60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
de70: 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78     if( pPk==pIdx
de80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
de90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dea0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
deb0: 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b  _Count, iIdxCur+
dec0: 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  j, 3);.         
ded0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
dee0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
def0: 50 5f 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29  P_Eq, 8+j, 0, 3)
df00: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
df10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
df20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
df30: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
df40: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
df50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
df60: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70  adString(v, 4, p
df70: 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
df80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df90: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dfa0: 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 32 2c 20 33  _Concat, 4, 2, 3
dfb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
dfc0: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
dfd0: 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20  ultRow(v);.     
dfe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dff0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e000: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dr);.          }
e010: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
e020: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e030: 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
e040: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20       } .    }.  
e050: 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63    {.      static
e060: 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d   const int iLn =
e070: 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e   VDBE_OFFSET_LIN
e080: 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74  ENO(2);.      st
e090: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
e0a0: 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20  pList endCode[] 
e0b0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
e0c0: 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c  _AddImm,      1,
e0d0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
e0e0: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
e0f0: 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f    { OP_IfNotZero
e100: 2c 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20  ,   1, 4,       
e110: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
e120: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
e130: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
e140: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e150: 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   2 */.        { 
e160: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
e170: 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  3, 1,        0},
e180: 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20      /* 3 */.    
e190: 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20      { OP_Halt,  
e1a0: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
e1b0: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a     0},    /* 4 *
e1c0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53  /.        { OP_S
e1d0: 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33  tring8,     0, 3
e1e0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
e1f0: 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 5 */.        
e200: 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20  { OP_Goto,      
e210: 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30    0, 3,        0
e220: 7d 2c 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20  },    /* 6 */.  
e230: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62      };.      Vdb
e240: 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20  eOp *aOp;..     
e250: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
e260: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
e270: 72 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65  rraySize(endCode
e280: 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29  ), endCode, iLn)
e290: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 70 20  ;.      if( aOp 
e2a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30  ){.        aOp[0
e2b0: 5d 2e 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a  ].p2 = 1-mxErr;.
e2c0: 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70          aOp[2].p
e2d0: 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49  4type = P4_STATI
e2e0: 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  C;.        aOp[2
e2f0: 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20  ].p4.z = "ok";. 
e300: 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34         aOp[5].p4
e310: 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43  type = P4_STATIC
e320: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d  ;.        aOp[5]
e330: 2e 70 34 2e 7a 20 3d 20 28 63 68 61 72 2a 29 73  .p4.z = (char*)s
e340: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
e350: 49 54 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20  ITE_CORRUPT);.  
e360: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
e380: 76 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62  v, 0, sqlite3Vdb
e390: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
e3a0: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2);.    }.  }.  
e3b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
e3c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
e3d0: 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
e3e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e3f0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a  OMIT_UTF16.  /*.
e400: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e    **   PRAGMA en
e410: 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52  coding.  **   PR
e420: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
e430: 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22  "utf-8"|"utf-16"
e440: 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66  |"utf-16le"|"utf
e450: 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  -16be".  **.  **
e460: 20 49 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f   In its first fo
e470: 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20  rm, this pragma 
e480: 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f  returns the enco
e490: 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e  ding of the main
e4a0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
e4b0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
e4c0: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  is not initializ
e4d0: 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61  ed, it is initia
e4e0: 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a  lized now..  **.
e4f0: 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
e500: 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61  form of this pra
e510: 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  gma is a no-op i
e520: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
e530: 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61  ase file.  ** ha
e540: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
e550: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  en initialized. 
e560: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
e570: 73 65 74 73 20 74 68 65 20 64 65 66 61 75 6c 74  sets the default
e580: 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74  .  ** encoding t
e590: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
e5a0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
e5b0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 61  tabase file if a
e5c0: 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69   new file.  ** i
e5d0: 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e  s created. If an
e5e0: 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64   existing main d
e5f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
e600: 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  opened, then the
e610: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65  .  ** default te
e620: 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  xt encoding for 
e630: 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
e640: 61 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20  abase is used.. 
e650: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c   ** .  ** In all
e660: 20 63 61 73 65 73 20 6e 65 77 20 64 61 74 61 62   cases new datab
e670: 61 73 65 73 20 63 72 65 61 74 65 64 20 75 73 69  ases created usi
e680: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
e690: 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63  mmand are.  ** c
e6a0: 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68  reated to use th
e6b0: 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74  e same default t
e6c0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20  ext encoding as 
e6d0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e6e0: 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  e. If.  ** the m
e6f0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73  ain database has
e700: 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61   not been initia
e710: 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65  lized and/or cre
e720: 61 74 65 64 20 77 68 65 6e 20 41 54 54 41 43 48  ated when ATTACH
e730: 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65  .  ** is execute
e740: 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  d, this is done 
e750: 62 65 66 6f 72 65 20 74 68 65 20 41 54 54 41 43  before the ATTAC
e760: 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a  H operation..  *
e770: 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65  *.  ** In the se
e780: 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70  cond form this p
e790: 72 61 67 6d 61 20 73 65 74 73 20 74 68 65 20 74  ragma sets the t
e7a0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20  ext encoding to 
e7b0: 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20  be used in.  ** 
e7c0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c  new database fil
e7d0: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
e7e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68   this database h
e7f0: 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c  andle. It is onl
e800: 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66  y.  ** useful if
e810: 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61   invoked immedia
e820: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d  tely after the m
e830: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20  ain database i. 
e840: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
e850: 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20  yp_ENCODING: {. 
e860: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e870: 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b  struct EncName {
e880: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
e890: 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63  me;.      u8 enc
e8a0: 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73  ;.    } encnames
e8b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
e8c0: 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54  UTF8",     SQLIT
e8d0: 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c  E_UTF8        },
e8e0: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22  .      { "UTF-8"
e8f0: 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38  ,    SQLITE_UTF8
e900: 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d          },  /* M
e910: 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b  ust be element [
e920: 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  1] */.      { "U
e930: 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45  TF-16le", SQLITE
e940: 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20  _UTF16LE     }, 
e950: 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d   /* Must be elem
e960: 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20  ent [2] */.     
e970: 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53   { "UTF-16be", S
e980: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20  QLITE_UTF16BE   
e990: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
e9a0: 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a   element [3] */.
e9b0: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65        { "UTF16le
e9c0: 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ",  SQLITE_UTF16
e9d0: 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  LE     },.      
e9e0: 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20 53 51  { "UTF16be",  SQ
e9f0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20  LITE_UTF16BE    
ea00: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
ea10: 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20 20 20  -16",   0       
ea20: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a             }, /*
ea30: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ea40: 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  IVE */.      { "
ea50: 55 54 46 31 36 22 2c 20 20 20 20 30 20 20 20 20  UTF16",    0    
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
ea70: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   /* SQLITE_UTF16
ea80: 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20  NATIVE */.      
ea90: 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a  { 0, 0 }.    };.
eaa0: 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
eab0: 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a   EncName *pEnc;.
eac0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
ead0: 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41  ){    /* "PRAGMA
eae0: 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20   encoding" */.  
eaf0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
eb00: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
eb10: 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f  ) ) goto pragma_
eb20: 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  out;.      asser
eb30: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
eb40: 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51  TE_UTF8].enc==SQ
eb50: 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20  LITE_UTF8 );.   
eb60: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
eb70: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mes[SQLITE_UTF16
eb80: 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  LE].enc==SQLITE_
eb90: 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20  UTF16LE );.     
eba0: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
ebb0: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  s[SQLITE_UTF16BE
ebc0: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
ebd0: 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72  F16BE );.      r
ebe0: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
ebf0: 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28  v, encnames[ENC(
ec00: 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61  pParse->db)].zNa
ec10: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  me);.    }else{ 
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d         /* "PRAGM
ec40: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58  A encoding = XXX
ec50: 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  " */.      /* On
ec60: 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  ly change the va
ec70: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e  lue of sqlite.en
ec80: 63 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  c if the databas
ec90: 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a  e handle is not.
eca0: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
ecb0: 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69  ized. If the mai
ecc0: 6e 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  n database exist
ecd0: 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  s, the new sqlit
ece0: 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20  e.enc value.    
ecf0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65    ** will be ove
ed00: 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68  rwritten when th
ed10: 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74  e schema is next
ed20: 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64   loaded. If it d
ed30: 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
ed40: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c   already exists,
ed50: 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61   it will be crea
ed60: 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e  ted to use the n
ed70: 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75  ew encoding valu
ed80: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ed90: 20 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 21    if( .        !
eda0: 28 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  (DbHasProperty(d
edb0: 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
edc0: 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20  oaded)) || .    
edd0: 20 20 20 20 44 62 48 61 73 50 72 6f 70 65 72 74      DbHasPropert
ede0: 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74  y(db, 0, DB_Empt
edf0: 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  y) .      ){.   
ee00: 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65       for(pEnc=&e
ee10: 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63  ncnames[0]; pEnc
ee20: 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29  ->zName; pEnc++)
ee30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
ee40: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
ee50: 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e  p(zRight, pEnc->
ee60: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
ee70: 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
ee80: 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d  (db) = ENC(db) =
ee90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eea0: 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e   pEnc->enc ? pEn
eeb0: 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f  c->enc : SQLITE_
eec0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
eed0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
eee0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
eef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
ef00: 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29  ( !pEnc->zName )
ef10: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ef20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ef30: 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64  se, "unsupported
ef40: 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20   encoding: %s", 
ef50: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  zRight);.       
ef60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ef70: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
ef80: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ef90: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
efa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
efb0: 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  T_SCHEMA_VERSION
efc0: 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20  _PRAGMAS.  /*.  
efd0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
efe0: 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73  ema.]schema_vers
eff0: 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ion.  **   PRAGM
f000: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d  A [schema.]schem
f010: 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74  a_version = <int
f020: 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger>.  **.  ** 
f030: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
f040: 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20  .]user_version. 
f050: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
f060: 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69  hema.]user_versi
f070: 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  on = <integer>. 
f080: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
f090: 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c  A [schema.]freel
f0a0: 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20  ist_count.  **. 
f0b0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
f0c0: 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69  hema.]data_versi
f0d0: 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  on.  **.  **   P
f0e0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
f0f0: 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20  pplication_id.  
f100: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
f110: 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e  ema.]application
f120: 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  _id = <integer>.
f130: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72    **.  ** The pr
f140: 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65  agma's schema_ve
f150: 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76  rsion and user_v
f160: 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20  ersion are used 
f170: 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20  to set or get.  
f180: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
f190: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
f1a0: 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73  on and user-vers
f1b0: 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ion, respectivel
f1c0: 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65  y. Both.  ** the
f1d0: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
f1e0: 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65 72  and the user-ver
f1f0: 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20  sion are 32-bit 
f200: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a  signed integers.
f210: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
f220: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
f230: 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
f240: 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  e schema-cookie 
f250: 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20  is usually only 
f260: 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65  manipulated inte
f270: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
f280: 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63  . It.  ** is inc
f290: 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69  remented by SQLi
f2a0: 74 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  te whenever the 
f2b0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
f2c0: 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a  is modified (by.
f2d0: 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72    ** creating or
f2e0: 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c   dropping a tabl
f2f0: 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65  e or index). The
f300: 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
f310: 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  is used by.  ** 
f320: 53 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65  SQLite each time
f330: 20 61 20 71 75 65 72 79 20 69 73 20 65 78 65 63   a query is exec
f340: 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  uted to ensure t
f350: 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
f360: 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74   cache.  ** of t
f370: 68 65 20 73 63 68 65 6d 61 20 75 73 65 64 20 77  he schema used w
f380: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  hen compiling th
f390: 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63  e SQL query matc
f3a0: 68 65 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f  hes the schema o
f3b0: 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
f3c0: 61 73 65 20 61 67 61 69 6e 73 74 20 77 68 69 63  ase against whic
f3d0: 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71  h the compiled q
f3e0: 75 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79  uery is actually
f3f0: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20   executed..  ** 
f400: 53 75 62 76 65 72 74 69 6e 67 20 74 68 69 73 20  Subverting this 
f410: 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69  mechanism by usi
f420: 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d  ng "PRAGMA schem
f430: 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f  a_version" to mo
f440: 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
f450: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20  hema-version is 
f460: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67  potentially dang
f470: 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65  erous and may le
f480: 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20  ad to program.  
f490: 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64 61  ** crashes or da
f4a0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
f4b0: 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61 75 74  n. Use with caut
f4c0: 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ion!.  **.  ** T
f4d0: 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20  he user-version 
f4e0: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
f4f0: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
f500: 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73 65 64  . It may be used
f510: 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61   by.  ** applica
f520: 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75  tions for any pu
f530: 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  rpose..  */.  ca
f540: 73 65 20 50 72 61 67 54 79 70 5f 48 45 41 44 45  se PragTyp_HEADE
f550: 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  R_VALUE: {.    i
f560: 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72  nt iCookie = pPr
f570: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20  agma->iArg;  /* 
f580: 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20  Which cookie to 
f590: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f  read or write */
f5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f5b0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
f5c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
f5d0: 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d  t && (pPragma->m
f5e0: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
f5f0: 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29  g_ReadOnly)==0 )
f600: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  {.      /* Write
f610: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
f620: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
f630: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
f640: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74  t VdbeOpList set
f650: 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20  Cookie[] = {.   
f660: 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61       { OP_Transa
f670: 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c  ction,    0,  1,
f680: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f    0},    /* 0 */
f690: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  .        { OP_Se
f6a0: 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c  tCookie,      0,
f6b0: 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    0,  0},    /* 
f6c0: 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20  1 */.      };.  
f6d0: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
f6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f6f0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
f700: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
f710: 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29  ySize(setCookie)
f720: 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73  );.      aOp = s
f730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
f740: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
f750: 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74  (setCookie), set
f760: 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  Cookie, 0);.    
f770: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
f780: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
f790: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
f7a0: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
f7b0: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
f7c0: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
f7d0: 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43    aOp[1].p2 = iC
f7e0: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70  ookie;.      aOp
f7f0: 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33  [1].p3 = sqlite3
f800: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
f810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f820: 2a 20 52 65 61 64 20 74 68 65 20 73 70 65 63 69  * Read the speci
f830: 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75  fied cookie valu
f840: 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  e */.      stati
f850: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
f860: 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20  st readCookie[] 
f870: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
f880: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
f890: 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20    0,  0,  0},   
f8a0: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
f8b0: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
f8c0: 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30  ,      0,  1,  0
f8d0: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
f8e0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c        { OP_Resul
f8f0: 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20  tRow,       1,  
f900: 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a  1,  0}.      };.
f910: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
f920: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
f930: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
f940: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
f950: 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b  raySize(readCook
f960: 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ie));.      aOp 
f970: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f980: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
f990: 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c  ize(readCookie),
f9a0: 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20  readCookie,0);. 
f9b0: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
f9c0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
f9d0: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
f9e0: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
f9f0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
fa00: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
fa10: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d       aOp[1].p3 =
fa20: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20   iCookie;.      
fa30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61  sqlite3VdbeReusa
fa40: 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  ble(v);.    }.  
fa50: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
fa60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fa70: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f  _SCHEMA_VERSION_
fa80: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
fa90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
faa0: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
fab0: 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  AGS.  /*.  **   
fac0: 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f  PRAGMA compile_o
fad0: 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a  ptions.  **.  **
fae0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
faf0: 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65  s of all compile
fb00: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73  -time options us
fb10: 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
fb20: 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f  ,.  ** one optio
fb30: 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a  n per row..  */.
fb40: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
fb50: 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20  OMPILE_OPTIONS: 
fb60: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
fb70: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fb80: 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73  *zOpt;.    pPars
fb90: 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20  e->nMem = 1;.   
fba0: 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20   while( (zOpt = 
fbb0: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
fbc0: 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21  ption_get(i++))!
fbd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
fbe0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
fbf0: 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20  g(v, 1, zOpt);. 
fc00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
fc20: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
fc30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fc40: 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b  VdbeReusable(v);
fc50: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
fc60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fc70: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
fc80: 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e  N_DIAGS */..#ifn
fc90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fca0: 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WAL.  /*.  **   
fcb0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
fcc0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d  wal_checkpoint =
fcd0: 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65   passive|full|re
fce0: 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20  start|truncate. 
fcf0: 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f   **.  ** Checkpo
fd00: 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  int the database
fd10: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
fd20: 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50  agTyp_WAL_CHECKP
fd30: 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OINT: {.    int 
fd40: 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69  iBt = (pId2->z?i
fd50: 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db:SQLITE_MAX_AT
fd60: 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74  TACHED);.    int
fd70: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
fd80: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
fd90: 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  VE;.    if( zRig
fda0: 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
fdb0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fdc0: 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d  Right, "full")==
fdd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
fde0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
fdf0: 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20  KPOINT_FULL;.   
fe00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
fe10: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
fe20: 68 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d  ht, "restart")==
fe30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
fe40: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
fe50: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a  KPOINT_RESTART;.
fe60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fe70: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fe80: 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65  Right, "truncate
fe90: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
fea0: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
feb0: 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
fec0: 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
fed0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
fee0: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c  Mem = 3;.    sql
fef0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ff00: 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c  , OP_Checkpoint,
ff10: 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b   iBt, eMode, 1);
ff20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ff30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
ff40: 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20  ultRow, 1, 3);. 
ff50: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f   }.  break;..  /
ff60: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
ff70: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
ff80: 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  nt.  **   PRAGMA
ff90: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
ffa0: 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  int = N.  **.  *
ffb0: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61  * Configure a da
ffc0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ffd0: 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  n to automatical
ffe0: 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20  ly checkpoint a 
fff0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66  database.  ** af
10000 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  ter accumulating
10010 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65   N frames in the
10020 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66   log. Or query f
10030 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  or the current v
10040 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a  alue.  ** of N..
10050 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
10060 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  Typ_WAL_AUTOCHEC
10070 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66  KPOINT: {.    if
10080 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
10090 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
100a0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
100b0 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
100c0 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ght));.    }.   
100d0 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
100e0 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e  (v, .       db->
100f0 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71  xWalCallback==sq
10100 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
10110 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ook ? .         
10120 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f    SQLITE_PTR_TO_
10130 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29  INT(db->pWalArg)
10140 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65   : 0);.  }.  bre
10150 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ak;.#endif..  /*
10160 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68  .  **  PRAGMA sh
10170 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a  rink_memory.  **
10180 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
10190 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35  TION-OF: R-23445
101a0 2d 34 36 31 30 39 20 54 68 69 73 20 70 72 61 67  -46109 This prag
101b0 6d 61 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ma causes the da
101c0 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e  tabase.  ** conn
101d0 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20  ection on which 
101e0 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  it is invoked to
101f0 20 66 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   free up as much
10200 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20   memory as it.  
10210 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69  ** can, by calli
10220 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  ng sqlite3_db_re
10230 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a  lease_memory()..
10240 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
10250 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52  Typ_SHRINK_MEMOR
10260 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  Y: {.    sqlite3
10270 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
10280 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61  ry(db);.    brea
10290 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
102a0 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69  *  PRAGMA optimi
102b0 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
102c0 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20  optimize(MASK). 
102d0 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65   **  PRAGMA sche
102e0 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a  ma.optimize.  **
102f0 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e    PRAGMA schema.
10300 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20  optimize(MASK). 
10310 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74   **.  ** Attempt
10320 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
10330 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20   database.  All 
10340 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69  schemas are opti
10350 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72  mized in the fir
10360 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d  st.  ** two form
10370 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20  s, and only the 
10380 73 70 65 63 69 66 69 65 64 20 73 63 68 65 6d 61  specified schema
10390 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e   is optimized in
103a0 20 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e   the latter two.
103b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
103c0 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69  etails of optimi
103d0 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  zations performe
103e0 64 20 62 79 20 74 68 69 73 20 70 72 61 67 6d 61  d by this pragma
103f0 20 61 72 65 20 65 78 70 65 63 74 65 64 0a 20 20   are expected.  
10400 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64  ** to change and
10410 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69   improve over ti
10420 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e  me.  Application
10430 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70  s should anticip
10440 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ate that.  ** th
10450 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70  is pragma will p
10460 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d  erform new optim
10470 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75  izations in futu
10480 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a  re releases..  *
10490 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f  *.  ** The optio
104a0 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nal argument is 
104b0 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
104c0 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65  imizations to pe
104d0 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rform:.  **.  **
104e0 20 20 20 20 30 78 30 30 30 31 20 20 20 20 44 65      0x0001    De
104f0 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44  bugging mode.  D
10500 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70  o not actually p
10510 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d  erform any optim
10520 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20  izations.  **   
10530 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20 69             but i
10540 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e  nstead return on
10550 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  e line of text f
10560 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61  or each optimiza
10570 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20  tion.  **       
10580 20 20 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c         that woul
10590 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65  d have been done
105a0 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c  .  Off by defaul
105b0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t..  **.  **    
105c0 30 78 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e  0x0002    Run AN
105d0 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20  ALYZE on tables 
105e0 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66  that might benef
105f0 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75  it.  On by defau
10600 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  lt..  **        
10610 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20        See below 
10620 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
10630 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a  nformation..  **
10640 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20  .  **    0x0004 
10650 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c     (Not yet impl
10660 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20  emented) Record 
10670 75 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72  usage and perfor
10680 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20  mance .  **     
10690 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61           informa
106a0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75  tion from the cu
106b0 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e  rrent session in
106c0 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20   the.  **       
106d0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
106e0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
106f0 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c  will be availabl
10700 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a  e to "optimize".
10710 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
10720 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79    pragmas run by
10730 20 66 75 74 75 72 65 20 64 61 74 61 62 61 73 65   future database
10740 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
10750 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30  **.  **    0x000
10760 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d  8    (Not yet im
10770 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74  plemented) Creat
10780 65 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d  e indexes that m
10790 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20  ight have.  **  
107a0 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
107b0 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65   helpful to rece
107c0 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a  nt queries.  **.
107d0 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
107e0 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77   MASK is and alw
107f0 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66  ays shall be 0xf
10800 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61  ffe.  0xfffe mea
10810 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20  ns perform all. 
10820 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d   ** of the optim
10830 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20  izations listed 
10840 61 62 6f 76 65 20 65 78 63 65 70 74 20 44 65 62  above except Deb
10850 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69  ug Mode, includi
10860 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69  ng new.  ** opti
10870 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68  mizations that h
10880 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
10890 20 69 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e   invented.  If n
108a0 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ew optimizations
108b0 20 61 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61   are.  ** ever a
108c0 64 64 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  dded that should
108d0 20 62 65 20 6f 66 66 20 62 79 20 64 65 66 61 75   be off by defau
108e0 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79  lt, those off-by
108f0 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f  -default .  ** o
10900 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c  ptimizations wil
10910 6c 20 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20  l have bitmasks 
10920 6f 66 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61  of 0x10000 or la
10930 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rger..  **.  ** 
10940 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46  DETERMINATION OF
10950 20 57 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41   WHEN TO RUN ANA
10960 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  LYZE.  **.  ** I
10970 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
10980 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20  plementation, a 
10990 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65  table is analyze
109a0 64 20 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  d if only if all
109b0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c   of.  ** the fol
109c0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
109d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d  .  **.  ** (1) M
109e0 41 53 4b 20 62 69 74 20 30 78 30 32 20 69 73 20  ASK bit 0x02 is 
109f0 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  set..  **.  ** (
10a00 32 29 20 54 68 65 20 71 75 65 72 79 20 70 6c 61  2) The query pla
10a10 6e 6e 65 72 20 75 73 65 64 20 73 71 6c 69 74 65  nner used sqlite
10a20 5f 73 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61  _stat1-style sta
10a30 74 69 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20  tistics for one 
10a40 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65  or.  **     more
10a50 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20   indexes of the 
10a60 74 61 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f  table at some po
10a70 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c  int during the l
10a80 69 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20  ifetime of.  ** 
10a90 20 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20      the current 
10aa0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
10ab0 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72  .  ** (3) One or
10ac0 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66   more indexes of
10ad0 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 63   the table are c
10ae0 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79  urrently unanaly
10af0 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20  zed OR.  **     
10b00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
10b10 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
10b20 68 61 73 20 69 6e 63 72 65 61 73 65 64 20 62 79  has increased by
10b30 20 32 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72   25 times or mor
10b40 65 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65  e.  **     since
10b50 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41   the last time A
10b60 4e 41 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a  NALYZE was run..
10b70 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75    **.  ** The ru
10b80 6c 65 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62  les for when tab
10b90 6c 65 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64  les are analyzed
10ba0 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63   are likely to c
10bb0 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75  hange in.  ** fu
10bc0 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20  ture releases.. 
10bd0 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
10be0 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20  yp_OPTIMIZE: {. 
10bf0 20 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20     int iDbLast; 
10c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10c10 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f  p termination po
10c20 69 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68 65  int for the sche
10c30 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ma loop */.    i
10c40 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
10c50 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10c60 66 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73  for a table whos
10c70 65 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65  e size needs che
10c80 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73  cking */.    Has
10c90 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
10ca0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72      /* Loop over
10cb0 20 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68   tables of a sch
10cc0 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d  ema */.    Schem
10cd0 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20  a *pSchema;     
10ce0 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
10cf0 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54   schema */.    T
10d00 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
10d10 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
10d20 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a   in the schema *
10d30 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
10d40 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
10d50 41 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  An index of the 
10d60 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67  table */.    Log
10d70 45 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b  Est szThreshold;
10d80 20 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65      /* Size thre
10d90 73 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63  shold above whic
10da0 68 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20  h reanalysis is 
10db0 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61  needd */.    cha
10dc0 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20  r *zSubSql;     
10dd0 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
10de0 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f  ment for the OP_
10df0 53 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a  SqlExec opcode *
10e00 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b  /.    u32 opMask
10e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10e20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f  Mask of operatio
10e30 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ns to perform */
10e40 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ..    if( zRight
10e50 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b   ){.      opMask
10e60 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 41   = (u32)sqlite3A
10e70 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
10e80 20 20 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26     if( (opMask &
10e90 20 30 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61   0x02)==0 ) brea
10ea0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
10eb0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66      opMask = 0xf
10ec0 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ffe;.    }.    i
10ed0 54 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d  TabCur = pParse-
10ee0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72  >nTab++;.    for
10ef0 28 69 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69  (iDbLast = zDb?i
10f00 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db:db->nDb-1; iD
10f10 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b  b<=iDbLast; iDb+
10f20 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44  +){.      if( iD
10f30 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==1 ) continue;
10f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
10f50 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
10f60 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
10f70 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d     pSchema = db-
10f80 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
10f90 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73  a;.      for(k=s
10fa0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
10fb0 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
10fc0 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ); k; k=sqliteHa
10fd0 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
10fe0 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
10ff0 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
11000 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  a(k);..        /
11010 2a 20 49 66 20 74 61 62 6c 65 20 70 54 61 62 20  * If table pTab 
11020 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65  has not been use
11030 64 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20  d in a way that 
11040 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72  would benefit fr
11050 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  om.        ** ha
11060 76 69 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74  ving analysis st
11070 61 74 69 73 74 69 63 73 20 64 75 72 69 6e 67 20  atistics during 
11080 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73  the current sess
11090 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69  ion, then skip i
110a0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
110b0 69 73 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20  is also has the 
110c0 65 66 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69  effect of skippi
110d0 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ng virtual table
110e0 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20  s and views */. 
110f0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62         if( (pTab
11100 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
11110 53 74 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20  StatsUsed)==0 ) 
11120 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
11130 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20     /* Reanalyze 
11140 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
11150 32 35 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20  25 times larger 
11160 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e  than the last an
11170 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20  alysis */.      
11180 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20    szThreshold = 
11190 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
111a0 20 2b 20 34 36 3b 20 61 73 73 65 72 74 28 20 73   + 46; assert( s
111b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
111c0 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==46 );.        
111d0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
111e0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
111f0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
11200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
11210 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b  Idx->hasStat1 ){
11220 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 54  .            szT
11230 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a  hreshold = 0; /*
11240 20 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20   Always analyze 
11250 69 66 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63  if any index lac
11260 6b 73 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f  ks statistics */
11270 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
11280 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
11290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
112a0 20 20 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c    if( szThreshol
112b0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
112c0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
112d0 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c  pParse, iTabCur,
112e0 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
112f0 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
11300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11310 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d  ddOp3(v, OP_IfSm
11320 61 6c 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20  aller, iTabCur, 
11330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11350 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11360 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29  (v)+2+(opMask&1)
11370 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a  , szThreshold);.
11380 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
11390 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
113a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75     }.        zSu
113b0 62 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  bSql = sqlite3MP
113c0 72 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59  rintf(db, "ANALY
113d0 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22  ZE \"%w\".\"%w\"
113e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
11410 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d  .zDbSName, pTab-
11420 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
11430 20 69 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78   if( opMask & 0x
11440 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  01 ){.          
11450 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
11460 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11470 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
11480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11490 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
114a0 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c  , r1, 0, zSubSql
114b0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
114c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
114d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
114e0 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20  _ResultRow, r1, 
114f0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
11500 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
11510 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11520 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c  , OP_SqlExec, 0,
11530 20 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20   0, 0, zSubSql, 
11540 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
11550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11560 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11570 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
11580 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72  _Expire);.    br
11590 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
115a0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73   **   PRAGMA bus
115b0 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20  y_timeout.  **  
115c0 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d   PRAGMA busy_tim
115d0 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eout = N.  **.  
115e0 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ** Call sqlite3_
115f0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
11600 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65   N).  Return the
11610 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74   current timeout
11620 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f   value.  ** if o
11630 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e  ne is set.  If n
11640 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f  o busy handler o
11650 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 62 75  r a different bu
11660 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65  sy handler is se
11670 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73  t.  ** then 0 is
11680 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74   returned.  Sett
11690 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d  ing the busy_tim
116a0 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67  eout to 0 or neg
116b0 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62  ative.  ** disab
116c0 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e  les the timeout.
116d0 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50  .  */.  /*case P
116e0 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45  ragTyp_BUSY_TIME
116f0 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b  OUT*/ default: {
11700 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
11710 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d  agma->ePragTyp==
11720 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d  PragTyp_BUSY_TIM
11730 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20  EOUT );.    if( 
11740 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
11750 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
11760 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33  eout(db, sqlite3
11770 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
11780 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
11790 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e  ingleInt(v, db->
117a0 62 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20  busyTimeout);.  
117b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
117c0 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
117d0 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
117e0 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
117f0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d  oft_heap_limit =
11800 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50   N.  **.  ** IMP
11810 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
11820 52 2d 32 36 33 34 33 2d 34 35 39 33 30 20 54 68  R-26343-45930 Th
11830 69 73 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65  is pragma invoke
11840 73 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  s the.  ** sqlit
11850 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11860 69 74 36 34 28 29 20 69 6e 74 65 72 66 61 63 65  it64() interface
11870 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65   with the argume
11880 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20  nt N, if N is.  
11890 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 6e 64  ** specified and
118a0 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   is a non-negati
118b0 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  ve integer..  **
118c0 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
118d0 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36  OF: R-64451-0716
118e0 33 20 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f  3 The soft_heap_
118f0 6c 69 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77  limit pragma alw
11900 61 79 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ays.  ** returns
11910 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65   the same intege
11920 72 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20  r that would be 
11930 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
11940 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66    ** sqlite3_sof
11950 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d  t_heap_limit64(-
11960 31 29 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75  1) C-language fu
11970 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
11980 61 73 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54  ase PragTyp_SOFT
11990 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20  _HEAP_LIMIT: {. 
119a0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
119b0 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67   N;.    if( zRig
119c0 68 74 20 26 26 20 73 71 6c 69 74 65 33 44 65 63  ht && sqlite3Dec
119d0 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68  OrHexToI64(zRigh
119e0 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f  t, &N)==SQLITE_O
119f0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11a00 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11a10 69 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20  it64(N);.    }. 
11a20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
11a30 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f  nt(v, sqlite3_so
11a40 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
11a50 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  -1));.    break;
11a60 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11a70 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73    PRAGMA threads
11a80 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
11a90 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a  hreads = N.  **.
11aa0 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74    ** Configure t
11ab0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
11ac0 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65  r of worker thre
11ad0 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ads.  Return the
11ae0 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75   new.  ** maximu
11af0 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  m, which might b
11b00 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75  e less than requ
11b10 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ested..  */.  ca
11b20 73 65 20 50 72 61 67 54 79 70 5f 54 48 52 45 41  se PragTyp_THREA
11b30 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  DS: {.    sqlite
11b40 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69  3_int64 N;.    i
11b50 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26  f( zRight.     &
11b60 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
11b70 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
11b80 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  N)==SQLITE_OK.  
11b90 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29     && N>=0.    )
11ba0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11bb0 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
11bc0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
11bd0 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30  READS, (int)(N&0
11be0 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20  x7fffffff));.   
11bf0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
11c00 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
11c10 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49  3_limit(db, SQLI
11c20 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
11c30 54 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20  THREADS, -1));. 
11c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
11c50 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
11c60 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
11c70 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
11c80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72  .  /*.  ** Repor
11c90 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  t the current st
11ca0 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73  ate of file logs
11cb0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
11cc0 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  es.  */.  case P
11cd0 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54  ragTyp_LOCK_STAT
11ce0 55 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63  US: {.    static
11cf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
11d00 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20  st azLockName[] 
11d10 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63  = {.      "unloc
11d20 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20  ked", "shared", 
11d30 22 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e  "reserved", "pen
11d40 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76  ding", "exclusiv
11d50 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  e".    };.    in
11d60 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  t i;.    pParse-
11d70 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66  >nMem = 2;.    f
11d80 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
11d90 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11da0 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20  tree *pBt;.     
11db0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
11dc0 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ate = "unknown";
11dd0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
11de0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
11df0 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29  i].zDbSName==0 )
11e00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11e10 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69   pBt = db->aDb[i
11e20 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11e30 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74   pBt==0 || sqlit
11e40 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
11e50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11e60 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64  zState = "closed
11e70 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
11e80 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  f( sqlite3_file_
11e90 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20  control(db, i ? 
11ea0 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
11eb0 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20  ame : 0, .      
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11ee0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
11ef0 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49  STATE, &j)==SQLI
11f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11f10 20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63    zState = azLoc
11f20 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20  kName[j];.      
11f30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
11f40 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
11f50 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62  1, "ss", db->aDb
11f60 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53  [i].zDbSName, zS
11f70 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tate);.    }.   
11f80 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
11f90 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
11fa0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a  E_HAS_CODEC.  /*
11fb0 20 50 72 61 67 6d 61 20 20 20 20 20 20 20 20 69   Pragma        i
11fc0 41 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  Arg.  ** -------
11fd0 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20 20 2a  ---   ------.  *
11fe0 2a 20 20 6b 65 79 20 20 20 20 20 20 20 20 20 20  *  key          
11ff0 20 30 0a 20 20 2a 2a 20 20 72 65 6b 65 79 20 20   0.  **  rekey  
12000 20 20 20 20 20 20 20 31 0a 20 20 2a 2a 20 20 68         1.  **  h
12010 65 78 6b 65 79 20 20 20 20 20 20 20 20 32 0a 20  exkey        2. 
12020 20 2a 2a 20 20 68 65 78 72 65 6b 65 79 20 20 20   **  hexrekey   
12030 20 20 20 33 0a 20 20 2a 2a 20 20 74 65 78 74 6b     3.  **  textk
12040 65 79 20 20 20 20 20 20 20 34 0a 20 20 2a 2a 20  ey       4.  ** 
12050 20 74 65 78 74 72 65 6b 65 79 20 20 20 20 20 35   textrekey     5
12060 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
12070 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20  gTyp_KEY: {.    
12080 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
12090 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 61      int n = pPra
120a0 67 6d 61 2d 3e 69 41 72 67 3c 34 20 3f 20 73 71  gma->iArg<4 ? sq
120b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52  lite3Strlen30(zR
120c0 69 67 68 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20  ight) : -1;.    
120d0 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e    if( (pPragma->
120e0 69 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a  iArg & 1)==0 ){.
120f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12100 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  key_v2(db, zDb, 
12110 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20  zRight, n);.    
12120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12130 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76   sqlite3_rekey_v
12140 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68  2(db, zDb, zRigh
12150 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, n);.      }. 
12160 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
12170 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54    }.  case PragT
12180 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20  yp_HEXKEY: {.   
12190 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
121a0 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
121b0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
121c0 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
121d0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
121e0 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
121f0 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
12200 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69  ite3Isxdigit(zRi
12210 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ght[i]); i++){. 
12220 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
12230 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
12240 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67  te3HexToInt(zRig
12250 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ht[i]);.        
12260 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a  if( (i&1)!=0 ) z
12270 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65  Key[i/2] = iByte
12280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12290 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69 41  if( (pPragma->iA
122a0 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20 20  rg & 1)==0 ){.  
122b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65        sqlite3_ke
122c0 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
122d0 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20  ey, i/2);.      
122e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
122f0 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28  qlite3_rekey_v2(
12300 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69  db, zDb, zKey, i
12310 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  /2);.      }.   
12320 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
12330 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
12340 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
12350 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65  CODEC) || define
12360 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
12370 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72  CEROD).  case Pr
12380 61 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45  agTyp_ACTIVATE_E
12390 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a  XTENSIONS: if( z
123a0 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20  Right ){.#ifdef 
123b0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
123c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
123d0 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
123e0 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29   "see-", 4)==0 )
123f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
12400 61 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52  activate_see(&zR
12410 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a  ight[4]);.    }.
12420 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
12430 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f  LITE_ENABLE_CERO
12440 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
12450 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74  3StrNICmp(zRight
12460 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d  , "cerod-", 6)==
12470 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12480 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f  e3_activate_cero
12490 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20  d(&zRight[6]);. 
124a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
124b0 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
124c0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
124d0 68 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68  he PRAGMA switch
124e0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   */..  /* The fo
124f0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73  llowing block is
12500 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
12510 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
12520 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c  defined. Its onl
12530 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69  y.  ** purpose i
12540 73 20 74 6f 20 65 78 65 63 75 74 65 20 61 73 73  s to execute ass
12550 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
12560 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
12570 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67  if the.  ** Prag
12580 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66  Flg_NoColumns1 f
12590 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
125a0 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  he caller specif
125b0 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a  ied an argument.
125c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47    ** to the PRAG
125d0 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  MA, the implemen
125e0 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61  tation has not a
125f0 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75  dded any OP_Resu
12600 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74  ltRow .  ** inst
12610 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  ructions to the 
12620 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  VM.  */.  if( (p
12630 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
12640 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
12650 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74  umns1) && zRight
12660 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12670 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c  dbeVerifyNoResul
12680 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72  tRow(v);.  }..pr
12690 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  agma_out:.  sqli
126a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c  te3DbFree(db, zL
126b0 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  eft);.  sqlite3D
126c0 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74  bFree(db, zRight
126d0 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  );.}.#ifndef SQL
126e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
126f0 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TABLE./*********
12700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12740 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ****.** Implemen
12750 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f  tation of an epo
12760 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
12770 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61  able that runs a
12780 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74   pragma..**.*/.t
12790 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72  ypedef struct Pr
127a0 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56  agmaVtab PragmaV
127b0 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72  tab;.typedef str
127c0 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75  uct PragmaVtabCu
127d0 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43  rsor PragmaVtabC
127e0 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72  ursor;.struct Pr
127f0 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c  agmaVtab {.  sql
12800 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20  ite3_vtab base; 
12810 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63         /* Base c
12820 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66  lass.  Must be f
12830 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
12840 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12850 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
12860 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
12870 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e  o which it belon
12880 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72  gs */.  const Pr
12890 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b  agmaName *pName;
128a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
128b0 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20   pragma */.  u8 
128c0 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20  nHidden;        
128d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
128e0 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d   of hidden colum
128f0 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64  ns */.  u8 iHidd
12900 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
12910 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
12920 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 63  e first hidden c
12930 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75  olumn */.};.stru
12940 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  ct PragmaVtabCur
12950 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
12960 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
12970 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e  ; /* Base class.
12980 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20    Must be first 
12990 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
129a0 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f  t *pPragma;    /
129b0 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73 74 61  * The pragma sta
129c0 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f  tement to run */
129d0 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
129e0 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20  iRowid;      /* 
129f0 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
12a00 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32  .  char *azArg[2
12a10 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ];           /* 
12a20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67  Value of the arg
12a30 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61  ument and schema
12a40 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50   */.};../* .** P
12a50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
12a60 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e  ble module xConn
12a70 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
12a80 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
12a90 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73  VtabConnect(.  s
12aa0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
12ab0 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
12ac0 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
12ad0 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
12ae0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
12af0 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
12b00 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74  pzErr.){.  const
12b10 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72   PragmaName *pPr
12b20 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72  agma = (const Pr
12b30 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a  agmaName*)pAux;.
12b40 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
12b50 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ab = 0;.  int rc
12b60 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
12b70 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
12b80 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b  .  StrAccum acc;
12b90 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
12ba0 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ];..  UNUSED_PAR
12bb0 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
12bc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12bd0 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65  (argv);.  sqlite
12be0 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61  3StrAccumInit(&a
12bf0 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a  cc, 0, zBuf, siz
12c00 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20  eof(zBuf), 0);. 
12c10 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
12c20 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22 43 52  endall(&acc, "CR
12c30 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b 0a  EATE TABLE x");.
12c40 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72    for(i=0, j=pPr
12c50 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65  agma->iPragCName
12c60 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72  ; i<pPragma->nPr
12c70 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b  agCName; i++, j+
12c80 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
12c90 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63  str_appendf(&acc
12ca0 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53  , "%c\"%s\"", cS
12cb0 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d  ep, pragCName[j]
12cc0 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c  );.    cSep = ',
12cd0 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d  ';.  }.  if( i==
12ce0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12cf0 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
12d00 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50  c, "(\"%s\"", pP
12d10 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ragma->zName);. 
12d20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20     i++;.  }.  j 
12d30 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67  = 0;.  if( pPrag
12d40 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
12d50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29  ragFlg_Result1 )
12d60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
12d70 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63  r_appendall(&acc
12d80 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22 29  , ",arg HIDDEN")
12d90 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
12da0 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50   if( pPragma->mP
12db0 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c  ragFlg & (PragFl
12dc0 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61 67  g_SchemaOpt|Prag
12dd0 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20 29  Flg_SchemaReq) )
12de0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
12df0 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63  r_appendall(&acc
12e00 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45  , ",schema HIDDE
12e10 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  N");.    j++;.  
12e20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  }.  sqlite3_str_
12e30 61 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29 22  append(&acc, ")"
12e40 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
12e50 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61  trAccumFinish(&a
12e60 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  cc);.  assert( s
12e70 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73 69  trlen(zBuf) < si
12e80 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a  zeof(zBuf)-1 );.
12e90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
12ea0 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20  eclare_vtab(db, 
12eb0 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
12ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12ed0 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61    pTab = (Pragma
12ee0 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Vtab*)sqlite3_ma
12ef0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61 67  lloc(sizeof(Prag
12f00 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69 66  maVtab));.    if
12f10 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
12f20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
12f30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
12f40 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54  .      memset(pT
12f50 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72  ab, 0, sizeof(Pr
12f60 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20  agmaVtab));.    
12f70 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20    pTab->pName = 
12f80 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20 70  pPragma;.      p
12f90 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  Tab->db = db;.  
12fa0 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64 65      pTab->iHidde
12fb0 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54 61  n = i;.      pTa
12fc0 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a  b->nHidden = j;.
12fd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12fe0 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
12ff0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
13000 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
13010 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  (db));.  }..  *p
13020 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
13030 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72  _vtab*)pTab;.  r
13040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
13050 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
13060 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
13070 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68  xDisconnect meth
13080 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
13090 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63  t pragmaVtabDisc
130a0 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
130b0 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 50  tab *pVtab){.  P
130c0 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
130d0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 70  = (PragmaVtab*)p
130e0 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Vtab;.  sqlite3_
130f0 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65  free(pTab);.  re
13100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13110 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  }../* Figure out
13120 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
13130 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68  to use to search
13140 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61   a pragma virtua
13150 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
13160 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65 61  here are not rea
13170 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63 68  lly any index ch
13180 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20 77  oices.  But we w
13190 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67 65  ant to encourage
131a0 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c   the.** query pl
131b0 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d 3d  anner to give ==
131c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
131d0 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20 70  as many hidden p
131e0 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20  arameters as.** 
131f0 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65 73  possible, and es
13200 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20  pecially on the 
13210 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61 72  first hidden par
13220 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74 75  ameter.  So retu
13230 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73  rn a.** high cos
13240 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72 61  t if hidden para
13250 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f 6e  meters are uncon
13260 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  strained..*/.sta
13270 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13280 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69  abBestIndex(sqli
13290 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73  te3_vtab *tab, s
132a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
132b0 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20  o *pIdxInfo){.  
132c0 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
132d0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
132e0 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  tab;.  const str
132f0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13300 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43  x_constraint *pC
13310 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
13320 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65   i, j;.  int see
13330 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66  n[2];..  pIdxInf
13340 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
13350 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
13360 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64 65  if( pTab->nHidde
13370 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 53  n==0 ){ return S
13380 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43  QLITE_OK; }.  pC
13390 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
133a0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
133b0 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30  t;.  seen[0] = 0
133c0 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b  ;.  seen[1] = 0;
133d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
133e0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
133f0 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
13400 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66  raint++){.    if
13410 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
13420 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69  sable==0 ) conti
13430 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
13440 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51  nstraint->op!=SQ
13450 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
13460 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69  RAINT_EQ ) conti
13470 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
13480 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
13490 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64 65  n < pTab->iHidde
134a0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
134b0 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e    j = pConstrain
134c0 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61  t->iColumn - pTa
134d0 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20 20  b->iHidden;.    
134e0 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29 3b  assert( j < 2 );
134f0 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69  .    seen[j] = i
13500 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65  +1;.  }.  if( se
13510 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  en[0]==0 ){.    
13520 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
13530 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  tedCost = (doubl
13540 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20  e)2147483647;.  
13550 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
13560 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37  matedRows = 2147
13570 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75  483647;.    retu
13580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13590 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d  }.  j = seen[0]-
135a0 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
135b0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
135c0 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  j].argvIndex = 1
135d0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
135e0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
135f0 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66  ].omit = 1;.  if
13600 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72  ( seen[1]==0 ) r
13610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13620 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
13630 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
13640 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49  uble)20;.  pIdxI
13650 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
13660 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73  ws = 20;.  j = s
13670 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78  een[1]-1;.  pIdx
13680 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13690 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e  tUsage[j].argvIn
136a0 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49  dex = 2;.  pIdxI
136b0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
136c0 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20  Usage[j].omit = 
136d0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
136e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65  TE_OK;.}../* Cre
136f0 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
13700 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20   for the pragma 
13710 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
13720 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
13730 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74  maVtabOpen(sqlit
13740 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
13750 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13760 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b  sor **ppCursor){
13770 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13780 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73  sor *pCsr;.  pCs
13790 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
137a0 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d  ursor*)sqlite3_m
137b0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43  alloc(sizeof(*pC
137c0 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72  sr));.  if( pCsr
137d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
137e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
137f0 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  set(pCsr, 0, siz
13800 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75  eof(PragmaVtabCu
13810 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e  rsor));.  pCsr->
13820 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74  base.pVtab = pVt
13830 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20  ab;.  *ppCursor 
13840 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20  = &pCsr->base;. 
13850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13860 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61  K;.}../* Clear a
13870 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ll content from 
13880 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
13890 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a  able cursor. */.
138a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67  static void prag
138b0 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
138c0 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  r(PragmaVtabCurs
138d0 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
138e0 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   i;.  sqlite3_fi
138f0 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72  nalize(pCsr->pPr
13900 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70  agma);.  pCsr->p
13910 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f  Pragma = 0;.  fo
13920 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
13930 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b  ze(pCsr->azArg);
13940 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
13950 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a  e3_free(pCsr->az
13960 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73  Arg[i]);.    pCs
13970 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b  r->azArg[i] = 0;
13980 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65  .  }.}../* Close
13990 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61   a pragma virtua
139a0 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a  l table cursor *
139b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
139c0 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c  gmaVtabClose(sql
139d0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
139e0 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61   *cur){.  Pragma
139f0 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13a00 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13a10 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61  rsor*)cur;.  pra
13a20 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13a30 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69  ar(pCsr);.  sqli
13a40 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a  te3_free(pCsr);.
13a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13a60 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63  OK;.}../* Advanc
13a70 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72  e the pragma vir
13a80 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
13a90 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  r to the next ro
13aa0 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  w */.static int 
13ab0 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 73  pragmaVtabNext(s
13ac0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13ad0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
13ae0 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13af0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
13b00 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13b10 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69  pVtabCursor;.  i
13b20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13b30 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  K;..  /* Increme
13b40 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76 61  nt the xRowid va
13b50 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69  lue */.  pCsr->i
13b60 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72  Rowid++;.  asser
13b70 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  t( pCsr->pPragma
13b80 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
13b90 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW!=sqlite3_st
13ba0 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  ep(pCsr->pPragma
13bb0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
13bc0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13bd0 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20  Csr->pPragma);. 
13be0 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61     pCsr->pPragma
13bf0 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d 61   = 0;.    pragma
13c00 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
13c10 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCsr);.  }.  ret
13c20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
13c30 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
13c40 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46   table module xF
13c50 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f  ilter method..*/
13c60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
13c70 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20 20  maVtabFilter(.  
13c80 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13c90 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13ca0 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c  , .  int idxNum,
13cb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78   const char *idx
13cc0 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Str,.  int argc,
13cd0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
13ce0 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d  *argv.){.  Pragm
13cf0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13d00 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13d10 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
13d20 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  or;.  PragmaVtab
13d30 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
13d40 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73  Vtab*)(pVtabCurs
13d50 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e  or->pVtab);.  in
13d60 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
13d70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63  ;.  StrAccum acc
13d80 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
13d90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13da0 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55  TER(idxNum);.  U
13db0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13dc0 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67 6d  idxStr);.  pragm
13dd0 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13de0 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70  (pCsr);.  j = (p
13df0 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61  Tab->pName->mPra
13e00 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
13e10 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a  esult1)!=0 ? 0 :
13e20 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
13e30 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29  <argc; i++, j++)
13e40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
13e50 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
13e60 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
13e70 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
13e80 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
13e90 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72  j<ArraySize(pCsr
13ea0 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20  ->azArg) );.    
13eb0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 7a  assert( pCsr->az
13ec0 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20 20  Arg[j]==0 );.   
13ed0 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20   if( zText ){.  
13ee0 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b      pCsr->azArg[
13ef0 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  j] = sqlite3_mpr
13f00 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78 74  intf("%s", zText
13f10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  );.      if( pCs
13f20 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29  r->azArg[j]==0 )
13f30 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
13f40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13f50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13f60 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
13f70 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20  umInit(&acc, 0, 
13f80 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d 3e  0, 0, pTab->db->
13f90 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
13fa0 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 29  MIT_SQL_LENGTH])
13fb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  ;.  sqlite3_str_
13fc0 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20  appendall(&acc, 
13fd0 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66  "PRAGMA ");.  if
13fe0 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  ( pCsr->azArg[1]
13ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14000 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63  str_appendf(&acc
14010 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e 61  , "%Q.", pCsr->a
14020 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20  zArg[1]);.  }.  
14030 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
14040 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70 54 61 62  ndall(&acc, pTab
14050 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b  ->pName->zName);
14060 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41  .  if( pCsr->azA
14070 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c  rg[0] ){.    sql
14080 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
14090 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70 43  (&acc, "=%Q", pC
140a0 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  sr->azArg[0]);. 
140b0 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69   }.  zSql = sqli
140c0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
140d0 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20 7a  h(&acc);.  if( z
140e0 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
140f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14100 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
14110 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64 62  pare_v2(pTab->db
14120 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73  , zSql, -1, &pCs
14130 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a  r->pPragma, 0);.
14140 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14150 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Sql);.  if( rc!=
14160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14170 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72   pTab->base.zErr
14180 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
14190 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
141a0 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62 2d  te3_errmsg(pTab-
141b0 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75 72  >db));.    retur
141c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
141d0 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  rn pragmaVtabNex
141e0 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  t(pVtabCursor);.
141f0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20  }../*.** Pragma 
14200 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
14210 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64  dule xEof method
14220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14230 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73 71  pragmaVtabEof(sq
14240 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
14250 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b  r *pVtabCursor){
14260 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
14270 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
14280 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
14290 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65  VtabCursor;.  re
142a0 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72 61  turn (pCsr->pPra
142b0 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54  gma==0);.}../* T
142c0 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f  he xColumn metho
142d0 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73  d simply returns
142e0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
142f0 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  ng column from.*
14300 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20 0a  * the PRAGMA.  .
14310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
14320 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a  agmaVtabColumn(.
14330 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
14340 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
14350 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63  or, .  sqlite3_c
14360 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20  ontext *ctx, .  
14370 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d  int i.){.  Pragm
14380 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
14390 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
143a0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
143b0 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  or;.  PragmaVtab
143c0 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
143d0 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73  Vtab*)(pVtabCurs
143e0 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66  or->pVtab);.  if
143f0 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64 65  ( i<pTab->iHidde
14400 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
14410 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
14420 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
14430 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 50  n_value(pCsr->pP
14440 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65  ragma, i));.  }e
14450 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
14460 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
14470 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d  , pCsr->azArg[i-
14480 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d  pTab->iHidden],-
14490 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  1,SQLITE_TRANSIE
144a0 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NT);.  }.  retur
144b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
144c0 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
144d0 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
144e0 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64  le xRowid method
144f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14500 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64 28  pragmaVtabRowid(
14510 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
14520 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
14530 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
14540 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  p){.  PragmaVtab
14550 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
14560 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
14570 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
14580 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77   *p = pCsr->iRow
14590 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
145a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
145b0 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
145c0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f   table object */
145d0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
145e0 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61  lite3_module pra
145f0 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20  gmaVtabModule = 
14600 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  {.  0,          
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14620 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
14630 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14650 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61  * xCreate - crea
14660 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  te a table */.  
14670 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63  pragmaVtabConnec
14680 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
14690 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65  xConnect - conne
146a0 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  ct to an existin
146b0 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61  g table */.  pra
146c0 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78  gmaVtabBestIndex
146d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65  ,         /* xBe
146e0 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d  stIndex - Determ
146f0 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74  ine search strat
14700 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  egy */.  pragmaV
14710 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20  tabDisconnect,  
14720 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
14730 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63  nect - Disconnec
14740 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a  t from a table *
14750 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44   /* xDestroy - D
14780 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  rop a table */. 
14790 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c   pragmaVtabOpen,
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
147b0 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
147c0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67  cursor */.  prag
147d0 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20 20  maVtabClose,    
147e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
147f0 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
14800 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
14810 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20  tabFilter,      
14820 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
14830 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
14840 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
14850 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  .  pragmaVtabNex
14860 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
14870 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e  /* xNext - advan
14880 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ce a cursor */. 
14890 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c 20   pragmaVtabEof, 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
148b0 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d   xEof */.  pragm
148c0 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20  aVtabColumn,    
148d0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75          /* xColu
148e0 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  mn - read data *
148f0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52 6f  /.  pragmaVtabRo
14900 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
14910 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61   /* xRowid - rea
14920 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20  d data */.  0,  
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
14950 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61  ate - write data
14960 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62     /* xBegin - b
14990 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
149a0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79     /* xSync - sy
149d0 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nc transaction *
149e0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f   /* xCommit - co
14a10 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  mmit transaction
14a20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
14a50 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  - rollback trans
14a60 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
14a90 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63  dFunction - func
14aa0 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
14ab0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20     /* xRename - 
14ae0 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65  rename the table
14af0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
14b20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a     /* xRelease *
14b50 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20   /* xRollbackTo 
14b80 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65    /* xShadowName
14bb0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
14bc0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54  eck to see if zT
14bd0 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79  abName is really
14be0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70   the name of a p
14bf0 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73  ragma.  If it is
14c00 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74  ,.** then regist
14c10 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  er an eponymous 
14c20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f  virtual table fo
14c30 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e  r that pragma an
14c40 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
14c50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64  inter to the Mod
14c60 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ule object for t
14c70 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  he new virtual t
14c80 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20  able..*/.Module 
14c90 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74  *sqlite3PragmaVt
14ca0 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  abRegister(sqlit
14cb0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
14cc0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f  ar *zName){.  co
14cd0 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
14ce0 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  pName;.  assert(
14cf0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
14d00 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
14d10 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  _", 7)==0 );.  p
14d20 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63  Name = pragmaLoc
14d30 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20  ate(zName+7);.  
14d40 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72  if( pName==0 ) r
14d50 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
14d60 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20  pName->mPragFlg 
14d70 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  & (PragFlg_Resul
14d80 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  t0|PragFlg_Resul
14d90 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  t1))==0 ) return
14da0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
14db0 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
14dc0 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
14dd0 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  e)==0 );.  retur
14de0 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72 65  n sqlite3VtabCre
14df0 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e  ateModule(db, zN
14e00 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62  ame, &pragmaVtab
14e10 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70  Module, (void*)p
14e20 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e  Name, 0);.}..#en
14e30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14e40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
14e50 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
14e60 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
14e70 20 2a 2f 0a                                       */.