/ Hex Artifact Content
Login

Artifact 221cb3384d33a8926c72083a73a137607e36f3f3ecb65a25d51a340df0f2684b:


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 28 75 36 34 29 53 51 4c 49 54 45 5f 43  = ~(u64)SQLITE_C
6990: 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20  acheSpill;.     
69a0: 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50   }.      setAllP
69b0: 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20  agerFlags(db);. 
69c0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
69d0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
69e0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
69f0: 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20 20 2a  mmap_size(N).  *
6a00: 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f 20 73  *.  ** Used to s
6a10: 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  et mapping size 
6a20: 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70 70 69  limit. The mappi
6a30: 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20 69 73  ng size limit is
6a40: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 6c 69  .  ** used to li
6a50: 6d 69 74 20 74 68 65 20 61 67 67 72 65 67 61 74  mit the aggregat
6a60: 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 6d 65  e size of all me
6a70: 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67 69  mory mapped regi
6a80: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
6a90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
6aa0: 66 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  f this parameter
6ab0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c   is set to zero,
6ac0: 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 70   then memory map
6ad0: 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ping.  ** is not
6ae0: 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20 20 49   used at all.  I
6af0: 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65 2c  f N is negative,
6b00: 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75 6c   then the defaul
6b10: 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20 2a  t memory map.  *
6b20: 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d 69 6e  * limit determin
6b30: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f  ed by sqlite3_co
6b40: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
6b50: 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20 69 73  IG_MMAP_SIZE) is
6b60: 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65 20 70   set..  ** The p
6b70: 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20 6d 65  arameter N is me
6b80: 61 73 75 72 65 64 20 69 6e 20 62 79 74 65 73 2e  asured in bytes.
6b90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
6ba0: 76 61 6c 75 65 20 69 73 20 61 64 76 69 73 6f 72  value is advisor
6bb0: 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c 79 69  y.  The underlyi
6bc0: 6e 67 20 56 46 53 20 69 73 20 66 72 65 65 20 74  ng VFS is free t
6bd0: 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20 2a  o memory map.  *
6be0: 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72 20 61  * as little or a
6bf0: 73 20 6d 75 63 68 20 61 73 20 69 74 20 77 61 6e  s much as it wan
6c00: 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ts.  Except, if 
6c10: 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20 74 68  N is set to 0 th
6c20: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70 70 65  en the.  ** uppe
6c30: 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20 6e 65  r layers will ne
6c40: 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20 78  ver invoke the x
6c50: 46 65 74 63 68 20 69 6e 74 65 72 66 61 63 65 73  Fetch interfaces
6c60: 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20 20 2a   to the VFS..  *
6c70: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6c80: 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
6c90: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
6ca0: 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  sz;.#if SQLITE_M
6cb0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
6cc0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
6cd0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
6ce0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
6cf0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
6d00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
6d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
6d20: 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
6d30: 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  ht, &sz);.      
6d40: 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20 3d 20  if( sz<0 ) sz = 
6d50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
6d60: 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  fig.szMmap;.    
6d70: 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30    if( pId2->n==0
6d80: 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20   ) db->szMmap = 
6d90: 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  sz;.      for(ii
6da0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
6db0: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
6dc0: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69    if( db->aDb[ii
6dd0: 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44  ].pBt && (ii==iD
6de0: 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29  b || pId2->n==0)
6df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6e00: 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
6e10: 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62 5b 69  pLimit(db->aDb[i
6e20: 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20 20 20  i].pBt, sz);.   
6e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6e40: 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 2d 31     }.    sz = -1
6e50: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
6e60: 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
6e70: 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
6e80: 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
6e90: 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20   &sz);.#else.   
6ea0: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72 63 20   sz = 0;.    rc 
6eb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  = SQLITE_OK;.#en
6ec0: 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  dif.    if( rc==
6ed0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6ee0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6ef0: 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20 20 7d  nt(v, sz);.    }
6f00: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
6f10: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
6f20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
6f30: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  rr++;.      pPar
6f40: 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
6f50: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
6f60: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
6f70: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
6f80: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
6f90: 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64 65 66  emp_store = "def
6fa0: 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22 7c 22  ault"|"memory"|"
6fb0: 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file".  **.  ** 
6fc0: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
6fd0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
6fe0: 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 20   the temp_store 
6ff0: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7000: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76    ** the local v
7010: 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  alue does not ma
7020: 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ke changes to th
7030: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20  e disk file and 
7040: 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a  the default.  **
7050: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
7060: 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74  estored the next
7070: 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
7080: 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a 20 20  se is opened..  
7090: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
70a0: 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  t it is possible
70b0: 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72 79   for the library
70c0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
70d0: 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20 6f 76  tions to.  ** ov
70e0: 65 72 72 69 64 65 20 74 68 69 73 20 73 65 74 74  erride this sett
70f0: 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ing.  */.  case 
7100: 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f  PragTyp_TEMP_STO
7110: 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  RE: {.    if( !z
7120: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
7130: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
7140: 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  , db->temp_store
7150: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7160: 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53 74      changeTempSt
7170: 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a 52  orage(pParse, zR
7180: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
7190: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
71a0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
71b0: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
71c0: 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41 47  tory.  **   PRAG
71d0: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
71e0: 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64 69  rectory = ""|"di
71f0: 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20 20  rectory_name".  
7200: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
7210: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
7220: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d  value of the tem
7230: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
7240: 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  y flag.  Changin
7250: 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  g.  ** the value
7260: 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63   sets a specific
7270: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62 65   directory to be
7280: 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72   used for tempor
7290: 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a 2a 20  ary files..  ** 
72a0: 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c  Setting to a nul
72b0: 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73  l string reverts
72c0: 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20   to the default 
72d0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
72e0: 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20 2a 2a  ory search..  **
72f0: 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20 64 69   If temporary di
7300: 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67  rectory is chang
7310: 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c 69 64  ed, then invalid
7320: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 2e 0a  ateTempStorage..
7330: 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
7340: 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54   PragTyp_TEMP_ST
7350: 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b  ORE_DIRECTORY: {
7360: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
7370: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7380: 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71  SingleText(v, sq
7390: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
73a0: 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tory);.    }else
73b0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
73c0: 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
73d0: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
73e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
73f0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
7400: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64  qlite3OsAccess(d
7410: 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c  b->pVfs, zRight,
7420: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
7430: 45 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b  EADWRITE, &res);
7440: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
7450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65  =SQLITE_OK || re
7460: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
7470: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7480: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61  g(pParse, "not a
7490: 20 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74   writable direct
74a0: 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ory");.         
74b0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
74c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
74d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51    }.      if( SQ
74e0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
74f0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51  =0.       || (SQ
7500: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
7510: 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73  =1 && db->temp_s
7520: 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20 20 20  tore<=1).       
7530: 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  || (SQLITE_TEMP_
7540: 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62 2d 3e  STORE==2 && db->
7550: 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29 0a 20  temp_store==1). 
7560: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7570: 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53 74  invalidateTempSt
7580: 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b 0a 20  orage(pParse);. 
7590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
75a0: 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74 65  ite3_free(sqlite
75b0: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
75c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  );.      if( zRi
75d0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
75e0: 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64    sqlite3_temp_d
75f0: 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69 74  irectory = sqlit
7600: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
7610: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
7620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7630: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
7640: 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  ctory = 0;.     
7650: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
7660: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a  ITE_OMIT_WSD */.
7670: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7680: 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
7690: 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a  _OS_WIN.  /*.  *
76a0: 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f  *   PRAGMA data_
76b0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a  store_directory.
76c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61    **   PRAGMA da
76d0: 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
76e0: 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f  ry = ""|"directo
76f0: 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20  ry_name".  **.  
7700: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
7710: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7720: 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73 74 6f   of the data_sto
7730: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61  re_directory fla
7740: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7750: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7760: 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65   a specific dire
7770: 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64  ctory to be used
7780: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
7790: 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 77 65  les that.  ** we
77a0: 72 65 20 73 70 65 63 69 66 69 65 64 20 77 69 74  re specified wit
77b0: 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
77c0: 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e 67 20  hname.  Setting 
77d0: 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  to a null string
77e0: 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20 74 6f   reverts.  ** to
77f0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 61 74   the default dat
7800: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 2c  abase directory,
7810: 20 77 68 69 63 68 20 66 6f 72 20 64 61 74 61 62   which for datab
7820: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
7830: 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ied with.  ** a 
7840: 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 77 69  relative path wi
7850: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65 20 62  ll probably be b
7860: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
7870: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ent directory fo
7880: 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65  r the.  ** proce
7890: 73 73 2e 20 20 44 61 74 61 62 61 73 65 20 66 69  ss.  Database fi
78a0: 6c 65 20 73 70 65 63 69 66 69 65 64 20 77 69 74  le specified wit
78b0: 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  h an absolute pa
78c0: 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70 61 63  th are not impac
78d0: 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 69 73  ted.  ** by this
78e0: 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61 72 64   setting, regard
78f0: 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61 6c 75  less of its valu
7900: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63  e..  **.  */.  c
7910: 61 73 65 20 50 72 61 67 54 79 70 5f 44 41 54 41  ase PragTyp_DATA
7920: 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59  _STORE_DIRECTORY
7930: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
7940: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
7950: 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c  urnSingleText(v,
7960: 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
7970: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65  rectory);.    }e
7980: 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse{.#ifndef SQL
7990: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
79a0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d     if( zRight[0]
79b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
79c0: 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  res;.        rc 
79d0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
79e0: 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67  s(db->pVfs, zRig
79f0: 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ht, SQLITE_ACCES
7a00: 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72 65  S_READWRITE, &re
7a10: 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
7a20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
7a30: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
7a40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7a50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
7a60: 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69 72  t a writable dir
7a70: 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  ectory");.      
7a80: 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f      goto pragma_
7a90: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
7aa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7ab0: 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74 65  ite3_free(sqlite
7ac0: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7ad0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  );.      if( zRi
7ae0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7af0: 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
7b00: 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69 74  irectory = sqlit
7b10: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
7b20: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
7b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7b40: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
7b50: 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  ctory = 0;.     
7b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
7b70: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a  ITE_OMIT_WSD */.
7b80: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7b90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
7ba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
7bb0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 2f  OCKING_STYLE.  /
7bc0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
7bd0: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72  [schema.]lock_pr
7be0: 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20 20 20  oxy_file.  **   
7bf0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
7c00: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20  lock_proxy_file 
7c10: 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b  = ":auto:"|"lock
7c20: 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20 2a 2a  _file_path".  **
7c30: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
7c40: 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
7c50: 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f   the lock_proxy_
7c60: 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68 61 6e  file flag.  Chan
7c70: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61  ging.  ** the va
7c80: 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69  lue sets a speci
7c90: 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65 20 75  fic file to be u
7ca0: 73 65 64 20 66 6f 72 20 64 61 74 61 62 61 73 65  sed for database
7cb0: 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e 0a 20   access locks.. 
7cc0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
7cd0: 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f  PragTyp_LOCK_PRO
7ce0: 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  XY_FILE: {.    i
7cf0: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
7d00: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
7d10: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
7d20: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
7d30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 72 6f  .      char *pro
7d40: 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d 20 4e  xy_file_path = N
7d50: 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL;.      sqlit
7d60: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
7d70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
7d80: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
7d90: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
7da0: 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c  ntrolHint(pFile,
7db0: 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
7dc0: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f 66 69         &proxy_fi
7df0: 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20 20 20  le_path);.      
7e00: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
7e10: 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65 5f 70  (v, proxy_file_p
7e20: 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
7e30: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
7e40: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
7e50: 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42  reePager(pDb->pB
7e60: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7e70: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  3_file *pFile = 
7e80: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
7e90: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
7ea0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 69  int res;.      i
7eb0: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7ec0: 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c 69          res=sqli
7ed0: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7ee0: 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 53  (pFile, SQLITE_S
7ef0: 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
7f00: 2c 20 0a 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 20 20 20 20 20 7a 52 69 67 68 74 29 3b          zRight);
7f30: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
7f40: 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c 69          res=sqli
7f50: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7f60: 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 53  (pFile, SQLITE_S
7f70: 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
7f80: 2c 20 0a 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 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20          NULL);. 
7fb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7fc0: 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   res!=SQLITE_OK 
7fd0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7fe0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7ff0: 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65  e, "failed to se
8000: 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  t lock proxy fil
8010: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  e");.        got
8020: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
8030: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8040: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
8050: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
8060: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
8070: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 0a 20   */      .    . 
8080: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
8090: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68  A [schema.]synch
80a0: 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52  ronous.  **   PR
80b0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79  AGMA [schema.]sy
80c0: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e  nchronous=OFF|ON
80d0: 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54  |NORMAL|FULL|EXT
80e0: 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  RA.  **.  ** Ret
80f0: 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c  urn or set the l
8100: 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  ocal value of th
8110: 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c  e synchronous fl
8120: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
8130: 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ** the local val
8140: 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ue does not make
8150: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
8160: 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68  disk file and th
8170: 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76  e.  ** default v
8180: 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73  alue will be res
8190: 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20 74  tored the next t
81a0: 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
81b0: 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e   is.  ** opened.
81c0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
81d0: 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  gTyp_SYNCHRONOUS
81e0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
81f0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
8200: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
8210: 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
8220: 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l-1);.    }else{
8230: 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e  .      if( !db->
8240: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
8250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8260: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8270: 20 20 20 20 20 20 20 20 20 20 20 22 53 61 66 65             "Safe
8280: 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e 6f 74  ty level may not
8290: 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e 73 69   be changed insi
82a0: 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  de a transaction
82b0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
82c0: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
82d0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 76 65 6c        int iLevel
82e0: 20 3d 20 28 67 65 74 53 61 66 65 74 79 4c 65 76   = (getSafetyLev
82f0: 65 6c 28 7a 52 69 67 68 74 2c 30 2c 31 29 2b 31  el(zRight,0,1)+1
8300: 29 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  ) & PAGER_SYNCHR
8310: 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 20 20  ONOUS_MASK;.    
8320: 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d      if( iLevel==
8330: 30 20 29 20 69 4c 65 76 65 6c 20 3d 20 31 3b 0a  0 ) iLevel = 1;.
8340: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
8350: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 69 4c 65 76  ety_level = iLev
8360: 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  el;.        pDb-
8370: 3e 62 53 79 6e 63 53 65 74 20 3d 20 31 3b 0a 20  >bSyncSet = 1;. 
8380: 20 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67         setAllPag
8390: 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20  erFlags(db);.   
83a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
83b0: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
83c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
83d0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
83e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
83f0: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
8400: 41 53 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  AS.  case PragTy
8410: 70 5f 46 4c 41 47 3a 20 7b 0a 20 20 20 20 69 66  p_FLAG: {.    if
8420: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
8430: 20 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65       setPragmaRe
8440: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
8450: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 20  v, pPragma);.   
8460: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
8470: 6e 74 28 76 2c 20 28 64 62 2d 3e 66 6c 61 67 73  nt(v, (db->flags
8480: 20 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67   & pPragma->iArg
8490: 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )!=0 );.    }els
84a0: 65 7b 0a 20 20 20 20 20 20 75 36 34 20 6d 61 73  e{.      u64 mas
84b0: 6b 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  k = pPragma->iAr
84c0: 67 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  g;    /* Mask of
84d0: 20 62 69 74 73 20 74 6f 20 73 65 74 20 6f 72 20   bits to set or 
84e0: 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 20 20 20 20  clear. */.      
84f0: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
8500: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
8510: 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79 20   /* Foreign key 
8520: 73 75 70 70 6f 72 74 20 6d 61 79 20 6e 6f 74 20  support may not 
8530: 62 65 20 65 6e 61 62 6c 65 64 20 6f 72 20 64 69  be enabled or di
8540: 73 61 62 6c 65 64 20 77 68 69 6c 65 20 6e 6f 74  sabled while not
8550: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61  .        ** in a
8560: 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
8570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73    */.        mas
8580: 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 46 6f  k &= ~(SQLITE_Fo
8590: 72 65 69 67 6e 4b 65 79 73 29 3b 0a 20 20 20 20  reignKeys);.    
85a0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 55    }.#if SQLITE_U
85b0: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
85c0: 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ON.      if( db-
85d0: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3d  >auth.authLevel=
85e0: 3d 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  =UAUTH_User ){. 
85f0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
8600: 20 61 6c 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e   allow non-admin
8610: 20 75 73 65 72 73 20 74 6f 20 6d 6f 64 69 66 79   users to modify
8620: 20 74 68 65 20 73 63 68 65 6d 61 20 61 72 62 69   the schema arbi
8630: 74 72 61 72 69 6c 79 20 2a 2f 0a 20 20 20 20 20  trarily */.     
8640: 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c     mask &= ~(SQL
8650: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
8660: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
8670: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
8680: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
8690: 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  ight, 0) ){.    
86a0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
86b0: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 65 6c   mask;.      }el
86c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
86d0: 66 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  flags &= ~mask;.
86e0: 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 73 6b          if( mask
86f0: 3d 3d 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  ==SQLITE_DeferFK
8700: 73 20 29 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s ) db->nDeferre
8710: 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
8720: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
8730: 4d 61 6e 79 20 6f 66 20 74 68 65 20 66 6c 61 67  Many of the flag
8740: 2d 70 72 61 67 6d 61 73 20 6d 6f 64 69 66 79 20  -pragmas modify 
8750: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
8760: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 0a 20  ed by the SQL . 
8770: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72       ** compiler
8780: 20 28 65 67 2e 20 63 6f 75 6e 74 5f 63 68 61 6e   (eg. count_chan
8790: 67 65 73 29 2e 20 53 6f 20 61 64 64 20 61 6e 20  ges). So add an 
87a0: 6f 70 63 6f 64 65 20 74 6f 20 65 78 70 69 72 65  opcode to expire
87b0: 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 63 6f   all.      ** co
87c0: 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74 65  mpiled SQL state
87d0: 6d 65 6e 74 73 20 61 66 74 65 72 20 6d 6f 64 69  ments after modi
87e0: 66 79 69 6e 67 20 61 20 70 72 61 67 6d 61 20 76  fying a pragma v
87f0: 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  alue..      */. 
8800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8810: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70  AddOp0(v, OP_Exp
8820: 69 72 65 29 3b 0a 20 20 20 20 20 20 73 65 74 41  ire);.      setA
8830: 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29  llPagerFlags(db)
8840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
8850: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41   SQLITE_OMIT_FLA
8870: 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  G_PRAGMAS */..#i
8880: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8890: 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53  T_SCHEMA_PRAGMAS
88a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
88b0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 3c  GMA table_info(<
88c0: 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a  table>).  **.  *
88d0: 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  * Return a singl
88e0: 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 63  e row for each c
88f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6e 61 6d  olumn of the nam
8900: 65 64 20 74 61 62 6c 65 2e 20 54 68 65 20 63 6f  ed table. The co
8910: 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
8920: 65 20 72 65 74 75 72 6e 65 64 20 64 61 74 61 20  e returned data 
8930: 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20  set are:.  **.  
8940: 2a 2a 20 63 69 64 3a 20 20 20 20 20 20 20 20 43  ** cid:        C
8950: 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d 62 65 72  olumn id (number
8960: 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  ed from left to 
8970: 72 69 67 68 74 2c 20 73 74 61 72 74 69 6e 67 20  right, starting 
8980: 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a  at 0).  ** name:
8990: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61         Column na
89a0: 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a 20 20 20  me.  ** type:   
89b0: 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65 63 6c 61      Column decla
89c0: 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a 20 20 2a  ration type..  *
89d0: 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20 20 54 72  * notnull:    Tr
89e0: 75 65 20 69 66 20 27 4e 4f 54 20 4e 55 4c 4c 27  ue if 'NOT NULL'
89f0: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6c 75   is part of colu
8a00: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 20  mn declaration. 
8a10: 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75 65 3a 20   ** dflt_value: 
8a20: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
8a30: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
8a40: 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a 2a 20 70  , if any..  ** p
8a50: 6b 3a 20 20 20 20 20 20 20 20 20 4e 6f 6e 2d 7a  k:         Non-z
8a60: 65 72 6f 20 66 6f 72 20 50 4b 20 66 69 65 6c 64  ero for PK field
8a70: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  s..  */.  case P
8a80: 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46  ragTyp_TABLE_INF
8a90: 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  O: if( zRight ){
8aa0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8ab0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
8ac0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
8ad0: 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e  pParse, LOCATE_N
8ae0: 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44  OERR, zRight, zD
8af0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
8b00: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
8b10: 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63  abDb = sqlite3Sc
8b20: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
8b30: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
8b40: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 0a        int i, k;.
8b50: 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64 65        int nHidde
8b60: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f 6c  n = 0;.      Col
8b70: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  umn *pCol;.     
8b80: 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
8b90: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
8ba0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
8bb0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8bc0: 20 37 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   7;.      sqlite
8bd0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8be0: 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44 62  a(pParse, iTabDb
8bf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8c00: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
8c10: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
8c20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
8c30: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
8c40: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8c50: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8c60: 20 20 20 20 20 20 69 6e 74 20 69 73 48 69 64 64        int isHidd
8c70: 65 6e 20 3d 20 49 73 48 69 64 64 65 6e 43 6f 6c  en = IsHiddenCol
8c80: 75 6d 6e 28 70 43 6f 6c 29 3b 0a 20 20 20 20 20  umn(pCol);.     
8c90: 20 20 20 69 66 28 20 69 73 48 69 64 64 65 6e 20     if( isHidden 
8ca0: 26 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67  && pPragma->iArg
8cb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8cc0: 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20   nHidden++;.    
8cd0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8ce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8cf0: 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c    if( (pCol->col
8d00: 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
8d10: 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20  PRIMKEY)==0 ){. 
8d20: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a           k = 0;.
8d30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8d40: 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPk==0 ){.    
8d50: 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20        k = 1;.   
8d60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8d70: 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
8d80: 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20  <=pTab->nCol && 
8d90: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d  pPk->aiColumn[k-
8da0: 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20  1]!=i; k++){}.  
8db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8dc0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44  assert( pCol->pD
8dd0: 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e  flt==0 || pCol->
8de0: 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50  pDflt->op==TK_SP
8df0: 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  AN );.        sq
8e00: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8e10: 61 64 28 76 2c 20 31 2c 20 70 50 72 61 67 6d 61  ad(v, 1, pPragma
8e20: 2d 3e 69 41 72 67 20 3f 20 22 69 73 73 69 73 69  ->iArg ? "issisi
8e30: 69 22 20 3a 20 22 69 73 73 69 73 69 22 2c 0a 20  i" : "issisi",. 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2d                i-
8e50: 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20  nHidden,.       
8e60: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
8e70: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8e80: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
8e90: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a  nType(pCol,""),.
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
8eb0: 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31  Col->notNull ? 1
8ec0: 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20   : 0,.          
8ed0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
8ee0: 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e   ? pCol->pDflt->
8ef0: 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20  u.zToken : 0,.  
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 2c 0a               k,.
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8f20: 73 48 69 64 64 65 6e 29 3b 0a 20 20 20 20 20 20  sHidden);.      
8f30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
8f40: 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  eak;..#ifdef SQL
8f50: 49 54 45 5f 44 45 42 55 47 0a 20 20 63 61 73 65  ITE_DEBUG.  case
8f60: 20 50 72 61 67 54 79 70 5f 53 54 41 54 53 3a 20   PragTyp_STATS: 
8f70: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
8f80: 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  x;.    HashElem 
8f90: 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  *i;.    pParse->
8fa0: 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 73 71  nMem = 5;.    sq
8fb0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
8fc0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
8fd0: 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 71  b);.    for(i=sq
8fe0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
8ff0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
9000: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
9010: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9020: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
9030: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
9040: 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(i);.      sql
9050: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9060: 64 28 76 2c 20 31 2c 20 22 73 73 69 69 69 22 2c  d(v, 1, "ssiii",
9070: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
9080: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
9090: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
90a0: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
90b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
90c0: 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c 0a 20  b->nRowLogEst,. 
90d0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
90e0: 74 61 62 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  tabFlags);.     
90f0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9100: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9110: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9120: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9130: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9140: 20 32 2c 20 22 73 69 69 69 58 22 2c 0a 20 20 20   2, "siiiX",.   
9150: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e          pIdx->zN
9160: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
9170: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 2c 0a  pIdx->szIdxRow,.
9180: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9190: 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 2c  >aiRowLogEst[0],
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
91b0: 2d 3e 68 61 73 53 74 61 74 31 29 3b 0a 20 20 20  ->hasStat1);.   
91c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
91d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
91e0: 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29 3b 0a 20  ultRow, 1, 5);. 
91f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9200: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
9210: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9220: 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69 66 28  _INDEX_INFO: if(
9230: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49   zRight ){.    I
9240: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
9250: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
9260: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46   pIdx = sqlite3F
9270: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69  indIndex(db, zRi
9280: 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ght, zDb);.    i
9290: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
92a0: 20 69 6e 74 20 69 49 64 78 44 62 20 3d 20 73 71   int iIdxDb = sq
92b0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
92c0: 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63  ex(db, pIdx->pSc
92d0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69 6e 74  hema);.      int
92e0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   i;.      int mx
92f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61  ;.      if( pPra
9300: 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20  gma->iArg ){.   
9310: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
9320: 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65  ndex_xinfo (newe
9330: 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d  r version with m
9340: 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c  ore rows and col
9350: 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20  umns) */.       
9360: 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c   mx = pIdx->nCol
9370: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61  umn;.        pPa
9380: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20  rse->nMem = 6;. 
9390: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
93a0: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
93b0: 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79  dex_info (legacy
93c0: 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20   version) */.   
93d0: 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e       mx = pIdx->
93e0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
93f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9400: 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  3;.      }.     
9410: 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54   pTab = pIdx->pT
9420: 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  able;.      sqli
9430: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
9440: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 49 64 78  ema(pParse, iIdx
9450: 44 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Db);.      asser
9460: 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c  t( pParse->nMem<
9470: 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43  =pPragma->nPragC
9480: 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 66 6f  Name );.      fo
9490: 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b  r(i=0; i<mx; i++
94a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 63  ){.        i16 c
94b0: 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  num = pIdx->aiCo
94c0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
94d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
94e0: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73  iLoad(v, 1, "iis
94f0: 58 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a 20 20 20  X", i, cnum,.   
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9510: 20 20 20 20 20 20 20 20 20 20 63 6e 75 6d 3c 30            cnum<0
9520: 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 61 43 6f   ? 0 : pTab->aCo
9530: 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[cnum].zName);.
9540: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 61          if( pPra
9550: 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20  gma->iArg ){.   
9560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9570: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 34  beMultiLoad(v, 4
9580: 2c 20 22 69 73 69 58 22 2c 0a 20 20 20 20 20 20  , "isiX",.      
9590: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 6f 72        pIdx->aSor
95a0: 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20 20 20 20  tOrder[i],.     
95b0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
95c0: 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  oll[i],.        
95d0: 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79      i<pIdx->nKey
95e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Col);.        }.
95f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9600: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9610: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 70 50  ResultRow, 1, pP
9620: 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  arse->nMem);.   
9630: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9640: 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20   break;..  case 
9650: 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 4c 49  PragTyp_INDEX_LI
9660: 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  ST: if( zRight )
9670: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
9680: 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
9690: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ab;.    int i;. 
96a0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
96b0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
96c0: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
96d0: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
96e0: 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20     int iTabDb = 
96f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
9700: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
9710: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 70  Schema);.      p
9720: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b  Parse->nMem = 5;
9730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
9740: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
9750: 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a  Parse, iTabDb);.
9760: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
9770: 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d 30  Tab->pIndex, i=0
9780: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9790: 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a  x->pNext, i++){.
97a0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
97b0: 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20 3d  ar *azOrigin[] =
97c0: 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22 70 6b   { "c", "u", "pk
97d0: 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  " };.        sql
97e0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
97f0: 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69 22 2c  d(v, 1, "isisi",
9800: 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20  .           i,. 
9810: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9820: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
9830: 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28    IsUniqueIndex(
9840: 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20  pIdx),.         
9850: 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78 2d    azOrigin[pIdx-
9860: 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20 20 20  >idxType],.     
9870: 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50 61 72        pIdx->pPar
9880: 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b 0a 20  tIdxWhere!=0);. 
9890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
98a0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
98b0: 65 20 50 72 61 67 54 79 70 5f 44 41 54 41 42 41  e PragTyp_DATABA
98c0: 53 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69  SE_LIST: {.    i
98d0: 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65  nt i;.    pParse
98e0: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
98f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
9900: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
9910: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
9920: 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Bt==0 ) continue
9930: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9940: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
9950: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ame!=0 );.      
9960: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9970: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 73 22  Load(v, 1, "iss"
9980: 2c 0a 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20  ,.         i,.  
9990: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
99a0: 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20  ].zDbSName,.    
99b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
99c0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
99d0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20  >aDb[i].pBt));. 
99e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
99f0: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9a00: 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54  p_COLLATION_LIST
9a10: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  : {.    int i = 
9a20: 30 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  0;.    HashElem 
9a30: 2a 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  *p;.    pParse->
9a40: 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f  nMem = 2;.    fo
9a50: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
9a60: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
9a70: 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  q); p; p=sqliteH
9a80: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
9a90: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9aa0: 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73  l = (CollSeq *)s
9ab0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
9ac0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9ad0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9ae0: 31 2c 20 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43  1, "is", i++, pC
9af0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
9b00: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9b10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
9b20: 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41  NTROSPECTION_PRA
9b30: 47 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61 67  GMAS.  case Prag
9b40: 54 79 70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  Typ_FUNCTION_LIS
9b50: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  T: {.    int i;.
9b60: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b      HashElem *j;
9b70: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  .    FuncDef *p;
9b80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9b90: 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69  m = 2;.    for(i
9ba0: 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55 4e  =0; i<SQLITE_FUN
9bb0: 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b  C_HASH_SZ; i++){
9bc0: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
9bd0: 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74  ite3BuiltinFunct
9be0: 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d  ions.a[i]; p; p=
9bf0: 70 2d 3e 75 2e 70 48 61 73 68 20 29 7b 0a 20 20  p->u.pHash ){.  
9c00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 75 6e        if( p->fun
9c10: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
9c20: 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 20 29 20  FUNC_INTERNAL ) 
9c30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9c50: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 69  tiLoad(v, 1, "si
9c60: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b  ", p->zName, 1);
9c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c80: 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48     for(j=sqliteH
9c90: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46  ashFirst(&db->aF
9ca0: 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74  unc); j; j=sqlit
9cb0: 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a 20  eHashNext(j)){. 
9cc0: 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63 44 65       p = (FuncDe
9cd0: 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  f*)sqliteHashDat
9ce0: 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(j);.      sqli
9cf0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9d00: 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e  (v, 1, "si", p->
9d10: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
9d20: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
9d30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9d40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9d50: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d    case PragTyp_M
9d60: 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20 20  ODULE_LIST: {.  
9d70: 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20    HashElem *j;. 
9d80: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9d90: 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 73  = 1;.    for(j=s
9da0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9db0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a 3b  db->aModule); j;
9dc0: 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   j=sqliteHashNex
9dd0: 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f 64  t(j)){.      Mod
9de0: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
9df0: 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ule*)sqliteHashD
9e00: 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71  ata(j);.      sq
9e10: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9e20: 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 70 4d  ad(v, 1, "s", pM
9e30: 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  od->zName);.    
9e40: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
9e50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9e60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9e70: 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72 61  E */..  case Pra
9e80: 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53 54  gTyp_PRAGMA_LIST
9e90: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  : {.    int i;. 
9ea0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
9eb0: 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d 61 4e  raySize(aPragmaN
9ec0: 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ame); i++){.    
9ed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9ee0: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22  tiLoad(v, 1, "s"
9ef0: 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69 5d  , aPragmaName[i]
9f00: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
9f10: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
9f20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54  if /* SQLITE_INT
9f30: 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d  ROSPECTION_PRAGM
9f40: 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  AS */..#endif /*
9f50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
9f60: 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  EMA_PRAGMAS */..
9f70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f80: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
9f90: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
9fa0: 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a  OREIGN_KEY_LIST:
9fb0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
9fc0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20     FKey *pFK;.  
9fd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9fe0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
9ff0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
a000: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
a010: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
a020: 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70     pFK = pTab->p
a030: 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20  FKey;.      if( 
a040: 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pFK ){.        i
a050: 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69  nt iTabDb = sqli
a060: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
a070: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
a080: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ma);.        int
a090: 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20   i = 0; .       
a0a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
a0b0: 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  8;.        sqlit
a0c0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
a0d0: 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ma(pParse, iTabD
a0e0: 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  b);.        whil
a0f0: 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20 20  e(pFK){.        
a100: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
a110: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46     for(j=0; j<pF
a120: 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  K->nCol; j++){. 
a130: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a140: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
a150: 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73 22  v, 1, "iissssss"
a160: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a170: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20       i,.        
a180: 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20 20             j,.  
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20   pFK->zTo,.     
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
a1c0: 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43  ab->aCol[pFK->aC
a1d0: 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61  ol[j].iFrom].zNa
a1e0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
a1f0: 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c         pFK->aCol
a200: 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20  [j].zCol,.      
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74               act
a220: 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63  ionName(pFK->aAc
a230: 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e  tion[1]),  /* ON
a240: 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 20   UPDATE */.     
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a260: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a270: 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f  ction[0]),  /* O
a280: 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20  N DELETE */.    
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
a2a0: 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20 20  NONE");.        
a2b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b 2b    }.          ++
a2c0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  i;.          pFK
a2d0: 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f   = pFK->pNextFro
a2e0: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
a2f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a300: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
a310: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
a320: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
a330: 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EY) */..#ifndef 
a340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
a350: 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20  IGN_KEY.#ifndef 
a360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
a370: 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67 54  GER.  case PragT
a380: 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 43  yp_FOREIGN_KEY_C
a390: 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65 79  HECK: {.    FKey
a3a0: 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20 20   *pFK;          
a3b0: 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e 20     /* A foreign 
a3c0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  key constraint *
a3d0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
a3e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
a3f0: 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e 74  Child table cont
a400: 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53 22  ain "REFERENCES"
a410: 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20   keyword */.    
a420: 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b 20  Table *pParent; 
a430: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
a440: 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69 6c   table that chil
a450: 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20  d points to */. 
a460: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
a470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
a480: 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ex in the parent
a490: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
a4a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
a4b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a4c0: 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20 6b  nter:  Foreign k
a4d0: 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54  ey number for pT
a4e0: 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b  ab */.    int j;
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a510: 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65 20  :  Field of the 
a520: 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a 20  foreign key */. 
a530: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20     HashElem *k; 
a540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a550: 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78 74  p counter:  Next
a560: 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d 61   table in schema
a570: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20 20   */.    int x;  
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a590: 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62 6c  * result variabl
a5a0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  e */.    int reg
a5b0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
a5c0: 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20 74  /* 3 registers t
a5d0: 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74 20  o hold a result 
a5e0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  row */.    int r
a5f0: 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  egKey;          
a600: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
a610: 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63 68   hold key for ch
a620: 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a 2f  ecking the FK */
a630: 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  .    int regRow;
a640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a650: 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
a660: 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61 62   a row from pTab
a670: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
a680: 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Top;           /
a690: 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70 20  * Top of a loop 
a6a0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67 6e  checking foreign
a6b0: 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e 74   keys */.    int
a6c0: 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20 20   addrOk;        
a6d0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
a6e0: 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20 4f   if the key is O
a6f0: 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69  K */.    int *ai
a700: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
a710: 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72 65  /* child to pare
a720: 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e  nt column mappin
a730: 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65 73  g */..    regRes
a740: 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ult = pParse->nM
a750: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
a760: 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20 20  ->nMem += 4;.   
a770: 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61 72   regKey = ++pPar
a780: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
a790: 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gRow = ++pParse-
a7a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 6b 20 3d 20 73  >nMem;.    k = s
a7b0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
a7c0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a7d0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 0a  hema->tblHash);.
a7e0: 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b 0a      while( k ){.
a7f0: 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44 62        int iTabDb
a800: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
a810: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ht ){.        pT
a820: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
a830: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
a840: 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  0, zRight, zDb);
a850: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  .        k = 0;.
a860: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a870: 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
a880: 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
a890: 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b  ta(k);.        k
a8a0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78   = sqliteHashNex
a8b0: 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(k);.      }.  
a8c0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
a8d0: 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d  || pTab->pFKey==
a8e0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
a8f0: 20 20 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c      iTabDb = sql
a900: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
a910: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
a920: 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
a930: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a940: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62  ema(pParse, iTab
a950: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
a960: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
a970: 73 65 2c 20 69 54 61 62 44 62 2c 20 70 54 61 62  se, iTabDb, pTab
a980: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
a990: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
a9a0: 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65  f( pTab->nCol+re
a9b0: 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d 65  gRow>pParse->nMe
a9c0: 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m ) pParse->nMem
a9d0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20   = pTab->nCol + 
a9e0: 72 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  regRow;.      sq
a9f0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
aa00: 50 61 72 73 65 2c 20 30 2c 20 69 54 61 62 44 62  Parse, 0, iTabDb
aa10: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
aa20: 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ead);.      sqli
aa30: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
aa40: 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  g(v, regResult, 
aa50: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
aa60: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
aa70: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
aa80: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
aa90: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
aaa0: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
aab0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
aac0: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
aad0: 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
aae0: 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f 6e  pParent==0 ) con
aaf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
ab00: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
ab10: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
ab20: 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62 44 62  k(pParse, iTabDb
ab30: 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c  , pParent->tnum,
ab40: 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61   0, pParent->zNa
ab50: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  me);.        x =
ab60: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
ab70: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
ab80: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
ab90: 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  x, 0);.        i
aba0: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
abb0: 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30       if( pIdx==0
abc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
abd0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
abe0: 28 70 50 61 72 73 65 2c 20 69 2c 20 69 54 61 62  (pParse, i, iTab
abf0: 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f  Db, pParent, OP_
ac00: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
ac10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ac20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ac30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ac40: 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64  OpenRead, i, pId
ac50: 78 2d 3e 74 6e 75 6d 2c 20 69 54 61 62 44 62 29  x->tnum, iTabDb)
ac60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
ac70: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
ac80: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
ac90: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dx);.          }
aca0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
acb0: 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b            k = 0;
acc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
acd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ace0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
acf0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
ad00: 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20   || pFK==0 );.  
ad10: 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62 72      if( pFK ) br
ad20: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
ad30: 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20  Parse->nTab<i ) 
ad40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69  pParse->nTab = i
ad50: 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
ad60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ad70: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
ad80: 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
ad90: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  ge(v);.      for
ada0: 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e  (i=1, pFK=pTab->
adb0: 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c  pFKey; pFK; i++,
adc0: 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46   pFK=pFK->pNextF
add0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50  rom){.        pP
ade0: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  arent = sqlite3F
adf0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b  indTable(db, pFK
ae00: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
ae10: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
ae20: 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d 20         aiCols = 
ae30: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
ae40: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
ae50: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46      x = sqlite3F
ae60: 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61  kLocateIndex(pPa
ae70: 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46  rse, pParent, pF
ae80: 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c  K, &pIdx, &aiCol
ae90: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  s);.          as
aea0: 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20  sert( x==0 );.  
aeb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aec0: 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33  addrOk = sqlite3
aed0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
aee0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ;..        /* Ge
aef0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
af00: 65 61 64 20 74 68 65 20 63 68 69 6c 64 20 6b 65  ead the child ke
af10: 79 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65  y values into re
af20: 67 69 73 74 65 72 73 0a 20 20 20 20 20 20 20 20  gisters.        
af30: 2a 2a 20 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f  ** regRow..regRo
af40: 77 2b 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20 74  w+n. If any of t
af50: 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c  he child key val
af60: 75 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68  ues are NULL, th
af70: 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  is .        ** r
af80: 6f 77 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20  ow cannot cause 
af90: 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e  an FK violation.
afa0: 20 4a 75 6d 70 20 64 69 72 65 63 74 6c 79 20 74   Jump directly t
afb0: 6f 20 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20  o addrOk in .   
afc0: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
afd0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  e. */.        fo
afe0: 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43  r(j=0; j<pFK->nC
aff0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
b000: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61      int iCol = a
b010: 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a  iCols ? aiCols[j
b020: 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d  ] : pFK->aCol[j]
b030: 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20  .iFrom;.        
b040: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b050: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
b060: 65 28 76 2c 20 70 54 61 62 2c 20 30 2c 20 69 43  e(v, pTab, 0, iC
b070: 6f 6c 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20  ol, regRow+j);. 
b080: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b090: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b0a0: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b  _IsNull, regRow+
b0b0: 6a 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65  j, addrOk); Vdbe
b0c0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b0d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
b0e0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
b0f0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 70 61   to query the pa
b100: 72 65 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 61  rent index for a
b110: 20 6d 61 74 63 68 69 6e 67 20 70 61 72 65 6e 74   matching parent
b120: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e  .        ** key.
b130: 20 49 66 20 61 20 6d 61 74 63 68 20 69 73 20 66   If a match is f
b140: 6f 75 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64  ound, jump to ad
b150: 64 72 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  drOk. */.       
b160: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
b170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b180: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
b190: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
b1a0: 77 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65  w, pFK->nCol, re
b1b0: 67 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  gKey,.          
b1c0: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
b1d0: 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70  AffinityStr(db,p
b1e0: 49 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29  Idx), pFK->nCol)
b1f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b200: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b210: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c  (v, OP_Found, i,
b220: 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c   addrOk, regKey,
b230: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56   0);.          V
b240: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b250: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
b260: 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
b270: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d         int jmp =
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
b290: 65 6e 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20  entAddr(v)+2;.  
b2a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b2b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b2c0: 53 65 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d  SeekRowid, i, jm
b2d0: 70 2c 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65  p, regRow); Vdbe
b2e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b2f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b300: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b  beGoto(v, addrOk
b310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
b320: 65 72 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d  ert( pFK->nCol==
b330: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  1 );.        }..
b340: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
b350: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 70 6f  ate code to repo
b360: 72 74 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69  rt an FK violati
b370: 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  on to the caller
b380: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
b390: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
b3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b3b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b3c0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72  , OP_Rowid, 0, r
b3d0: 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20  egResult+1);.   
b3e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b400: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
b410: 6c 6c 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74  ll, 0, regResult
b420: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +1);.        }. 
b430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b440: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72  beMultiLoad(v, r
b450: 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 58  egResult+2, "siX
b460: 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31  ", pFK->zTo, i-1
b470: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b480: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b490: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
b4a0: 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20  gResult, 4);.   
b4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b4c0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b4d0: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
b4e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b4f0: 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20  b, aiCols);.    
b500: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b510: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b520: 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54  P_Next, 0, addrT
b530: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
b540: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
b550: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b560: 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
b570: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
b580: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
b590: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b5a0: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e  _TRIGGER) */.#en
b5b0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
b5c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
b5d0: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66  IGN_KEY) */..#if
b5e0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63 61  ndef NDEBUG.  ca
b5f0: 73 65 20 50 72 61 67 54 79 70 5f 50 41 52 53 45  se PragTyp_PARSE
b600: 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  R_TRACE: {.    i
b610: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
b620: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
b630: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
b640: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73   0) ){.        s
b650: 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63  qlite3ParserTrac
b660: 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65  e(stdout, "parse
b670: 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r: ");.      }el
b680: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b690: 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28 30  te3ParserTrace(0
b6a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b6b0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
b6c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
b6d0: 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45  install the LIKE
b6e0: 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69   and GLOB functi
b6f0: 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e  ons.  The varian
b700: 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75  t of LIKE.  ** u
b710: 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65  sed will be case
b720: 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f   sensitive or no
b730: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  t depending on t
b740: 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63  he RHS..  */.  c
b750: 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53 45  ase PragTyp_CASE
b760: 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a  _SENSITIVE_LIKE:
b770: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
b780: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b790: 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75  e3RegisterLikeFu
b7a0: 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69  nctions(db, sqli
b7b0: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
b7c0: 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d  ight, 0));.    }
b7d0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
b7e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e  ifndef SQLITE_IN
b7f0: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
b800: 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65  ROR_MAX.# define
b810: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
b820: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
b830: 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69  X 100.#endif..#i
b840: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b850: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
b860: 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d 41  K.  /*    PRAGMA
b870: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b880: 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20  .  **    PRAGMA 
b890: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
b8a0: 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  N).  **    PRAGM
b8b0: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20  A quick_check.  
b8c0: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69  **    PRAGMA qui
b8d0: 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ck_check(N).  **
b8e0: 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 65  .  ** Verify the
b8f0: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
b900: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
b910: 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63 6b  .  ** The "quick
b920: 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63  _check" is reduc
b930: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  ed version of . 
b940: 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68   ** integrity_ch
b950: 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20  eck designed to 
b960: 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61  detect most data
b970: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a  base corruption.
b980: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65    ** without the
b990: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72 6f   overhead of cro
b9a0: 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64 65  ss-checking inde
b9b0: 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65 63  xes.  Quick_chec
b9c0: 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72  k.  ** is linear
b9d0: 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20 69   time wherease i
b9e0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69  ntegrity_check i
b9f0: 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f  s O(NlogN)..  */
ba00: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
ba10: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a  INTEGRITY_CHECK:
ba20: 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c   {.    int i, j,
ba30: 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20   addr, mxErr;.. 
ba40: 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d     int isQuick =
ba50: 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72   (sqlite3Tolower
ba60: 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29  (zLeft[0])=='q')
ba70: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
ba80: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20   PRAGMA command 
ba90: 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  was of the form 
baa0: 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74  "PRAGMA <db>.int
bab0: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20  egrity_check",. 
bac0: 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69     ** then iDb i
bad0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
bae0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
baf0: 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  se identified by
bb00: 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e   <db>..    ** In
bb10: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
bb20: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74  integrity of dat
bb30: 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69  abase iDb only i
bb40: 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20  s verified by.  
bb50: 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72    ** the VDBE cr
bb60: 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20  eated below..   
bb70: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
bb80: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d  wise, if the com
bb90: 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20  mand was simply 
bba0: 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  "PRAGMA integrit
bbb0: 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20  y_check" (or.   
bbc0: 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63   ** "PRAGMA quic
bbd0: 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20  k_check"), then 
bbe0: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e  iDb is set to 0.
bbf0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
bc00: 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f  et iDb.    ** to
bc10: 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64   -1 here, to ind
bc20: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56  icate that the V
bc30: 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66  DBE should verif
bc40: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a  y the integrity.
bc50: 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74      ** of all at
bc60: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
bc70: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
bc80: 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ( iDb>=0 );.    
bc90: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c  assert( iDb==0 |
bca0: 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20  | pId2->z );.   
bcb0: 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20   if( pId2->z==0 
bcc0: 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20  ) iDb = -1;..   
bcd0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
bce0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
bcf0: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
bd00: 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a  Mem = 6;..    /*
bd10: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
bd20: 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a   error count */.
bd30: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
bd40: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
bd50: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
bd60: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
bd70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
bd80: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d  Int32(zRight, &m
bd90: 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28  xErr);.      if(
bda0: 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20   mxErr<=0 ){.   
bdb0: 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c       mxErr = SQL
bdc0: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
bdd0: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
bde0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be00: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
be10: 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f  , mxErr-1, 1); /
be20: 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65  * reg[1] holds e
be30: 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20  rrors left */.. 
be40: 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65     /* Do an inte
be50: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65  grity check on e
be60: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
be70: 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
be80: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
be90: 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65  ){.      HashEle
bea0: 6d 20 2a 78 3b 20 20 20 20 20 2f 2a 20 46 6f 72  m *x;     /* For
beb0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
bec0: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63 68 65  bles in the sche
bed0: 6d 61 20 2a 2f 0a 20 20 20 20 20 20 48 61 73 68  ma */.      Hash
bee0: 20 2a 70 54 62 6c 73 3b 20 20 20 20 20 2f 2a 20   *pTbls;     /* 
bef0: 53 65 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  Set of all table
bf00: 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  s in the schema 
bf10: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 52  */.      int *aR
bf20: 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 72  oot;      /* Arr
bf30: 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 20  ay of root page 
bf40: 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 62  numbers of all b
bf50: 74 72 65 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  trees */.      i
bf60: 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20  nt cnt = 0;     
bf70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
bf80: 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20  ries in aRoot[] 
bf90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 49  */.      int mxI
bfa0: 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 4d 61 78  dx = 0;   /* Max
bfb0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
bfc0: 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 79 20 74  ndexes for any t
bfd0: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69  able */..      i
bfe0: 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  f( OMIT_TEMPDB &
bff0: 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  & i==1 ) continu
c000: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  e;.      if( iDb
c010: 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20 29 20  >=0 && i!=iDb ) 
c020: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
c030: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
c040: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
c050: 20 69 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44   i);..      /* D
c060: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
c070: 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72  heck of the B-Tr
c080: 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ee.      **.    
c090: 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69    ** Begin by fi
c0a0: 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70  nding the root p
c0b0: 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20 20  ages numbers.   
c0c0: 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61     ** for all ta
c0d0: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
c0e0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
c0f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c100: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c110: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
c120: 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20 20  db, i, 0) );.   
c130: 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e     pTbls = &db->
c140: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[i].pSchema->
c150: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 66  tblHash;.      f
c160: 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69  or(cnt=0, x=sqli
c170: 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c  teHashFirst(pTbl
c180: 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48  s); x; x=sqliteH
c190: 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20  ashNext(x)){.   
c1a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c1b0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c1c0: 61 28 78 29 3b 20 20 2f 2a 20 43 75 72 72 65 6e  a(x);  /* Curren
c1d0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
c1e0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
c210: 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   on pTab */.    
c220: 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20      int nIdx;   
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c250: 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 70 54  of indexes on pT
c260: 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ab */.        if
c270: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
c280: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
c290: 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49    for(nIdx=0, pI
c2a0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c2b0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c2c0: 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29  ->pNext, nIdx++)
c2d0: 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20  { cnt++; }.     
c2e0: 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49 64     if( nIdx>mxId
c2f0: 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64 78  x ) mxIdx = nIdx
c300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c310: 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  aRoot = sqlite3D
c320: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c330: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e   sizeof(int)*(cn
c340: 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  t+1));.      if(
c350: 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61   aRoot==0 ) brea
c360: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  k;.      for(cnt
c370: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
c380: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
c390: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
c3a0: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
c3b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c3c0: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
c3d0: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c3e0: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
c3f0: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
c400: 29 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d  ) aRoot[++cnt] =
c410: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pTab->tnum;.   
c420: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
c430: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
c440: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
c450: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  xt){.          a
c460: 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 49  Root[++cnt] = pI
c470: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
c480: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c490: 20 20 61 52 6f 6f 74 5b 30 5d 20 3d 20 63 6e 74    aRoot[0] = cnt
c4a0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
c4b0: 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
c4c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   number of regis
c4d0: 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
c4e0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c4f0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
c500: 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d   MAX( pParse->nM
c510: 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a 20  em, 8+mxIdx );. 
c520: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
c530: 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
c540: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
c550: 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20 69   Do the b-tree i
c560: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 20  ntegrity checks 
c570: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c580: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
c590: 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32 2c  _IntegrityCk, 2,
c5a0: 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a 29   cnt, 1, (char*)
c5b0: 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41  aRoot,P4_INTARRA
c5c0: 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Y);.      sqlite
c5d0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
c5e0: 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20 61   (u8)i);.      a
c5f0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c600: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
c610: 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f  Null, 2); VdbeCo
c620: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c640: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
c650: 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20  , 0, 3, 0,.     
c660: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c670: 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64  tf(db, "*** in d
c680: 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e  atabase %s ***\n
c690: 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  ", db->aDb[i].zD
c6a0: 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  bSName),.       
c6b0: 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20    P4_DYNAMIC);. 
c6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c6d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
c6e0: 63 61 74 2c 20 32 2c 20 33 2c 20 33 29 3b 0a 20  cat, 2, 3, 3);. 
c6f0: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
c700: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
c710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c720: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c730: 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  dr);..      /* M
c740: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
c750: 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e   indices are con
c760: 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63 74  structed correct
c770: 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
c780: 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65 48     for(x=sqliteH
c790: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
c7a0: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
c7b0: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
c7c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c7d0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
c7e0: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
c7f0: 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20   *pIdx, *pPk;.  
c800: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 72        Index *pPr
c810: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
c820: 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20   int loopTop;.  
c830: 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61 43        int iDataC
c840: 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20 20 20  ur, iIdxCur;.   
c850: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2d 31       int r1 = -1
c860: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
c870: 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f  Tab->tnum<1 ) co
c880: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70  ntinue;  /* Skip
c890: 20 56 49 45 57 73 20 6f 72 20 56 49 52 54 55 41   VIEWs or VIRTUA
c8a0: 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20  L TABLEs */.    
c8b0: 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77      pPk = HasRow
c8c0: 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73  id(pTab) ? 0 : s
c8d0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
c8e0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
c8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
c900: 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28  TableAndIndices(
c910: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50  pParse, pTab, OP
c920: 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20  _OpenRead, 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 20 20 20 20                  
c950: 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72   1, 0, &iDataCur
c960: 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20  , &iIdxCur);.   
c970: 20 20 20 20 20 2f 2a 20 72 65 67 5b 37 5d 20 63       /* reg[7] c
c980: 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72  ounts the number
c990: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
c9a0: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  he table..      
c9b0: 20 20 2a 2a 20 72 65 67 5b 38 2b 69 5d 20 63 6f    ** reg[8+i] co
c9c0: 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20  unts the number 
c9d0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
c9e0: 65 20 69 2d 74 68 20 69 6e 64 65 78 20 0a 20 20  e i-th index .  
c9f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ca00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca10: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ca20: 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  , 0, 7);.       
ca30: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
ca40: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
ca50: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
ca60: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
ca70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ca80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
ca90: 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f  eger, 0, 8+j); /
caa0: 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  * index entries 
cab0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
cac0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
cad0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ert( pParse->nMe
cae0: 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20 20 20 20  m>=8+j );.      
caf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cb00: 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
cb10: 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29 20 29 3b  pParse,1,7+j) );
cb20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cb30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cb40: 5f 52 65 77 69 6e 64 2c 20 69 44 61 74 61 43 75  _Rewind, iDataCu
cb50: 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
cb60: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
cb70: 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c 69 74 65  loopTop = sqlite
cb80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cb90: 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20 31 29 3b  P_AddImm, 7, 1);
cba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
cbb0: 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Quick ){.       
cbc0: 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65     /* Sanity che
cbd0: 63 6b 20 6f 6e 20 72 65 63 6f 72 64 20 68 65 61  ck on record hea
cbe0: 64 65 72 20 64 65 63 6f 64 69 6e 67 20 2a 2f 0a  der decoding */.
cbf0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cc00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cc10: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 44 61 74 61 43  P_Column, iDataC
cc20: 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  ur, pTab->nCol-1
cc30: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
cc40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cc50: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
cc60: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
cc70: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56    }.        /* V
cc80: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 4e  erify that all N
cc90: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
cca0: 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e  really are NOT N
ccb0: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ULL */.        f
ccc0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
ccd0: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
cce0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
ccf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
cd00: 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  jmp2;.          
cd10: 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
cd20: 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
cd30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61           if( pTa
cd40: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
cd50: 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ll==0 ) continue
cd60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cd70: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
cd80: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
cd90: 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 6a  Tab, iDataCur, j
cda0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
cdb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cdc0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
cdd0: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
cde0: 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74      jmp2 = sqlit
cdf0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ce00: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20  OP_NotNull, 3); 
ce10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ce20: 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20  .          zErr 
ce30: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
ce40: 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65  (db, "NULL value
ce50: 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54 61 62   in %s.%s", pTab
ce60: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
ce90: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
cea0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ceb0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
cec0: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
ced0: 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
cee0: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  C);.          in
cef0: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
cf00: 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20  ltRow(v);.      
cf10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
cf20: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29  umpHere(v, jmp2)
cf30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cf40: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 43 48      /* Verify CH
cf50: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
cf60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
cf70: 54 61 62 2d 3e 70 43 68 65 63 6b 20 26 26 20 28  Tab->pCheck && (
cf80: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
cf90: 54 45 5f 49 67 6e 6f 72 65 43 68 65 63 6b 73 29  TE_IgnoreChecks)
cfa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
cfb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 65 63   ExprList *pChec
cfc0: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
cfd0: 69 73 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  istDup(db, pTab-
cfe0: 3e 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20 20 20  >pCheck, 0);.   
cff0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
d000: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
d010: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
d020: 74 20 61 64 64 72 43 6b 46 61 75 6c 74 20 3d 20  t addrCkFault = 
d030: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d040: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
d050: 20 20 20 20 20 69 6e 74 20 61 64 64 72 43 6b 4f       int addrCkO
d060: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
d070: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d080: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
d090: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Err;.           
d0a0: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
d0b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
d0c0: 66 54 61 62 20 3d 20 69 44 61 74 61 43 75 72 20  fTab = iDataCur 
d0d0: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  + 1;.           
d0e0: 20 66 6f 72 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e   for(k=pCheck->n
d0f0: 45 78 70 72 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d  Expr-1; k>0; k--
d100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d110: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
d120: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 68 65  lse(pParse, pChe
d130: 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ck->a[k].pExpr, 
d140: 61 64 64 72 43 6b 46 61 75 6c 74 2c 20 30 29 3b  addrCkFault, 0);
d150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d160: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d170: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
d180: 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 30  rse, pCheck->a[0
d190: 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b 4f  ].pExpr, addrCkO
d1a0: 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
d1b0: 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49      SQLITE_JUMPI
d1c0: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
d1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d1e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
d1f0: 64 64 72 43 6b 46 61 75 6c 74 29 3b 0a 20 20 20  ddrCkFault);.   
d200: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
d210: 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20  >iSelfTab = 0;. 
d220: 20 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20             zErr 
d230: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d240: 28 64 62 2c 20 22 43 48 45 43 4b 20 63 6f 6e 73  (db, "CHECK cons
d250: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 20 69 6e  traint failed in
d260: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
d270: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
d280: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
d290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d2a0: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
d2b0: 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20   0, 3, 0, zErr, 
d2c0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
d2d0: 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69           integri
d2e0: 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77  tyCheckResultRow
d2f0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d300: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d310: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
d320: 43 6b 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  CkOk);.         
d330: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
d340: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
d350: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 29 3b 0a  te(db, pCheck);.
d360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d370: 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29    if( !isQuick )
d380: 7b 20 2f 2a 20 4f 6d 69 74 20 74 68 65 20 72 65  { /* Omit the re
d390: 6d 61 69 6e 69 6e 67 20 74 65 73 74 73 20 66 6f  maining tests fo
d3a0: 72 20 71 75 69 63 6b 5f 63 68 65 63 6b 20 2a 2f  r quick_check */
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  .          /* Va
d3c0: 6c 69 64 61 74 65 20 69 6e 64 65 78 20 65 6e 74  lidate index ent
d3d0: 72 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  ries for the cur
d3e0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  rent row */.    
d3f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
d400: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
d410: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
d420: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
d430: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d440: 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34  jmp2, jmp3, jmp4
d450: 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20 20  , jmp5;.        
d460: 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20 3d      int ckUniq =
d470: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d480: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d490: 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70        if( pPk==p
d4a0: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 31 20 3d              r1 =
d4c0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
d4d0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
d4e0: 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c   pIdx, iDataCur,
d4f0: 20 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20   0, 0, &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 20 20 20 20 20 70 50 72 69 6f 72 2c 20 72         pPrior, r
d530: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
d540: 70 50 72 69 6f 72 20 3d 20 70 49 64 78 3b 0a 20  pPrior = pIdx;. 
d550: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d560: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d570: 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20  OP_AddImm, 8+j, 
d580: 31 29 3b 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20  1);/* increment 
d590: 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20  entry count */. 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
d5b0: 72 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64  rify that an ind
d5c0: 65 78 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ex entry exists 
d5d0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
d5e0: 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20  table row */.   
d5f0: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
d600: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d610: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
d620: 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55  , iIdxCur+j, ckU
d630: 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  niq, 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 20 20 20 20                  
d660: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d670: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d680: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d690: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d6a0: 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22  ing(v, 3, "row "
d6b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d6c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d6d0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37  (v, OP_Concat, 7
d6e0: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d700: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c  LoadString(v, 4,
d710: 20 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20   " missing from 
d720: 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20  index ");.      
d730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d740: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d750: 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a  ncat, 4, 3, 3);.
d760: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 35              jmp5
d770: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f   = sqlite3VdbeLo
d780: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70  adString(v, 4, p
d790: 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
d7a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d7b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d7c0: 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33  _Concat, 4, 3, 3
d7d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
d7e0: 6d 70 34 20 3d 20 69 6e 74 65 67 72 69 74 79 43  mp4 = integrityC
d7f0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29  heckResultRow(v)
d800: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d810: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d820: 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20  e(v, jmp2);.    
d830: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55          /* For U
d840: 4e 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20 76  NIQUE indexes, v
d850: 65 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20  erify that only 
d860: 6f 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74 73  one entry exists
d870: 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
d880: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
d890: 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72 79   key.  The entry
d8a0: 20 69 73 20 75 6e 69 71 75 65 20 69 66 20 28 31   is unique if (1
d8b0: 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  ) any column is 
d8c0: 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20  NULL.           
d8d0: 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e   ** or (2) the n
d8e0: 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20  ext entry has a 
d8f0: 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f  different key */
d900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
d910: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
d920: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
d930: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b        int uniqOk
d940: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d950: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d960: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d            int jm
d970: 70 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p6;.            
d980: 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20 20    int kk;.      
d990: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30          for(kk=0
d9a0: 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  ; kk<pIdx->nKeyC
d9b0: 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20  ol; kk++){.     
d9c0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
d9d0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
d9e0: 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20  lumn[kk];.      
d9f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
da00: 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44  ( iCol!=XN_ROWID
da10: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
da20: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Col );.         
da30: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
da40: 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c  =0 && pTab->aCol
da50: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
da60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
da70: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
da80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
da90: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b  OP_IsNull, r1+kk
daa0: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
dab0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
dac0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
dad0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dae0: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 36 20 3d            jmp6 =
daf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db00: 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p1(v, OP_Next, i
db10: 49 64 78 43 75 72 2b 6a 29 3b 20 56 64 62 65 43  IdxCur+j); VdbeC
db20: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
db30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
db40: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69  3VdbeGoto(v, uni
db50: 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  qOk);.          
db60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
db70: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 36 29  umpHere(v, jmp6)
db80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
db90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dba0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 47 54  4Int(v, OP_IdxGT
dbb0: 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75 6e 69  , iIdxCur+j, uni
dbc0: 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  qOk, 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 20 20 20 20 20 70 49 64 78              pIdx
dbf0: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
dc00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
dc10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dc20: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
dc30: 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71  (v, 3, "non-uniq
dc40: 75 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65  ue entry in inde
dc50: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
dc60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
dc70: 6f 74 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20  oto(v, jmp5);.  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
dc90: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
dca0: 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a  bel(v, uniqOk);.
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
dcc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dcd0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
dce0: 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20 20   jmp4);.        
dcf0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
dd00: 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
dd10: 50 61 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20  Parse, jmp3);.  
dd20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd30: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
dd40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
dd50: 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74 61 43   OP_Next, iDataC
dd60: 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56 64  ur, loopTop); Vd
dd70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
dd80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dd90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c 6f  beJumpHere(v, lo
dda0: 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64 65  opTop-1);.#ifnde
ddb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
ddc0: 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 20  REECOUNT.       
ddd0: 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29 7b   if( !isQuick ){
dde0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ddf0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
de00: 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23 20  (v, 2, "wrong # 
de10: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e  of entries in in
de20: 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20  dex ");.        
de30: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d    for(j=0, pIdx=
de40: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
de50: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
de60: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
de70: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d          if( pPk=
de80: 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65  =pIdx ) continue
de90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
dea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
deb0: 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64  v, OP_Count, iId
dec0: 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20 20 20 20  xCur+j, 3);.    
ded0: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
dee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
def0: 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c 20  (v, OP_Eq, 8+j, 
df00: 30 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72  0, 3); VdbeCover
df10: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
df20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
df30: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
df40: 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  E_NOTNULL);.    
df50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
df60: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
df70: 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29   4, pIdx->zName)
df80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
df90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
dfa0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c  v, OP_Concat, 4,
dfb0: 20 32 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   2, 3);.        
dfc0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65      integrityChe
dfd0: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a  ckResultRow(v);.
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
dff0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
e000: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
e010: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
e020: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e030: 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
e040: 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20 20   */.      } .   
e050: 20 7d 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73   }.    {.      s
e060: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
e070: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
e080: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
e090: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e0a0: 56 64 62 65 4f 70 4c 69 73 74 20 65 6e 64 43 6f  VdbeOpList endCo
e0b0: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
e0c0: 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20   { OP_AddImm,   
e0d0: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
e0e0: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
e0f0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 4e 6f         { OP_IfNo
e100: 74 5a 65 72 6f 2c 20 20 20 31 2c 20 34 2c 20 20  tZero,   1, 4,  
e110: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
e120: 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  1 */.        { O
e130: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30  P_String8,     0
e140: 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 3,        0}, 
e150: 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20     /* 2 */.     
e160: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
e170: 77 2c 20 20 20 33 2c 20 31 2c 20 20 20 20 20 20  w,   3, 1,      
e180: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f    0},    /* 3 */
e190: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 48 61  .        { OP_Ha
e1a0: 6c 74 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  lt,        0, 0,
e1b0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
e1c0: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 4 */.        {
e1d0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
e1e0: 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d   0, 3,        0}
e1f0: 2c 20 20 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20  ,    /* 5 */.   
e200: 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20       { OP_Goto, 
e210: 20 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20         0, 3,    
e220: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 36 20      0},    /* 6 
e230: 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
e240: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a    VdbeOp *aOp;..
e250: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
e260: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
e270: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 65 6e  (v, ArraySize(en
e280: 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65 2c  dCode), endCode,
e290: 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28   iLn);.      if(
e2a0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20   aOp ){.        
e2b0: 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 31 2d 6d 78  aOp[0].p2 = 1-mx
e2c0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  Err;.        aOp
e2d0: 5b 32 5d 2e 70 34 74 79 70 65 20 3d 20 50 34 5f  [2].p4type = P4_
e2e0: 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20 20  STATIC;.        
e2f0: 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f  aOp[2].p4.z = "o
e300: 6b 22 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  k";.        aOp[
e310: 35 5d 2e 70 34 74 79 70 65 20 3d 20 50 34 5f 53  5].p4type = P4_S
e320: 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20 20 61  TATIC;.        a
e330: 4f 70 5b 35 5d 2e 70 34 2e 7a 20 3d 20 28 63 68  Op[5].p4.z = (ch
e340: 61 72 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74  ar*)sqlite3ErrSt
e350: 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  r(SQLITE_CORRUPT
e360: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e370: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e380: 67 65 50 33 28 76 2c 20 30 2c 20 73 71 6c 69 74  geP3(v, 0, sqlit
e390: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e3a0: 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 7d 0a 20  r(v)-2);.    }. 
e3b0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
e3c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e3d0: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
e3e0: 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
e3f0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
e400: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
e410: 4d 41 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a  MA encoding.  **
e420: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
e430: 6e 67 20 3d 20 22 75 74 66 2d 38 22 7c 22 75 74  ng = "utf-8"|"ut
e440: 66 2d 31 36 22 7c 22 75 74 66 2d 31 36 6c 65 22  f-16"|"utf-16le"
e450: 7c 22 75 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a  |"utf-16be".  **
e460: 0a 20 20 2a 2a 20 49 6e 20 69 74 73 20 66 69 72  .  ** In its fir
e470: 73 74 20 66 6f 72 6d 2c 20 74 68 69 73 20 70 72  st form, this pr
e480: 61 67 6d 61 20 72 65 74 75 72 6e 73 20 74 68 65  agma returns the
e490: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
e4a0: 20 6d 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62   main.  ** datab
e4b0: 61 73 65 2e 20 49 66 20 74 68 65 20 64 61 74 61  ase. If the data
e4c0: 62 61 73 65 20 69 73 20 6e 6f 74 20 69 6e 69 74  base is not init
e4d0: 69 61 6c 69 7a 65 64 2c 20 69 74 20 69 73 20 69  ialized, it is i
e4e0: 6e 69 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a  nitialized now..
e4f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
e500: 63 6f 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68 69  cond form of thi
e510: 73 20 70 72 61 67 6d 61 20 69 73 20 61 20 6e 6f  s pragma is a no
e520: 2d 6f 70 20 69 66 20 74 68 65 20 6d 61 69 6e 20  -op if the main 
e530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
e540: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
e550: 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  dy been initiali
e560: 7a 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  zed. In this cas
e570: 65 20 69 74 20 73 65 74 73 20 74 68 65 20 64 65  e it sets the de
e580: 66 61 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64  fault.  ** encod
e590: 69 6e 67 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ing that will be
e5a0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61   used for the ma
e5b0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
e5c0: 20 69 66 20 61 20 6e 65 77 20 66 69 6c 65 0a 20   if a new file. 
e5d0: 20 2a 2a 20 69 73 20 63 72 65 61 74 65 64 2e 20   ** is created. 
e5e0: 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d  If an existing m
e5f0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
e600: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65  e is opened, the
e610: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  n the.  ** defau
e620: 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  lt text encoding
e630: 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 69 6e   for the existin
e640: 67 20 64 61 74 61 62 61 73 65 20 69 73 20 75 73  g database is us
e650: 65 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  ed..  ** .  ** I
e660: 6e 20 61 6c 6c 20 63 61 73 65 73 20 6e 65 77 20  n all cases new 
e670: 64 61 74 61 62 61 73 65 73 20 63 72 65 61 74 65  databases create
e680: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
e690: 43 48 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20  CH command are. 
e6a0: 20 2a 2a 20 63 72 65 61 74 65 64 20 74 6f 20 75   ** created to u
e6b0: 73 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61  se the same defa
e6c0: 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ult text encodin
e6d0: 67 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61  g as the main da
e6e0: 74 61 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20  tabase. If.  ** 
e6f0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e700: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 69  e has not been i
e710: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f  nitialized and/o
e720: 72 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 41  r created when A
e730: 54 54 41 43 48 0a 20 20 2a 2a 20 69 73 20 65 78  TTACH.  ** is ex
e740: 65 63 75 74 65 64 2c 20 74 68 69 73 20 69 73 20  ecuted, this is 
e750: 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
e760: 41 54 54 41 43 48 20 6f 70 65 72 61 74 69 6f 6e  ATTACH operation
e770: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74  ..  **.  ** In t
e780: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74  he second form t
e790: 68 69 73 20 70 72 61 67 6d 61 20 73 65 74 73 20  his pragma sets 
e7a0: 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
e7b0: 67 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 0a  g to be used in.
e7c0: 20 20 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73    ** new databas
e7d0: 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
e7e0: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
e7f0: 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 74 20 69  ase handle. It i
e800: 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66  s only.  ** usef
e810: 75 6c 20 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d  ul if invoked im
e820: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
e830: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e840: 65 20 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  e i.  */.  case 
e850: 50 72 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47  PragTyp_ENCODING
e860: 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
e870: 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e  onst struct EncN
e880: 61 6d 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ame {.      char
e890: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75   *zName;.      u
e8a0: 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63  8 enc;.    } enc
e8b0: 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  names[] = {.    
e8c0: 20 20 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20    { "UTF8",     
e8d0: 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20  SQLITE_UTF8     
e8e0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
e8f0: 54 46 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45  TF-8",    SQLITE
e900: 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20  _UTF8        }, 
e910: 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d   /* Must be elem
e920: 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20  ent [1] */.     
e930: 20 7b 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53   { "UTF-16le", S
e940: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20  QLITE_UTF16LE   
e950: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
e960: 20 65 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a   element [2] */.
e970: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62        { "UTF-16b
e980: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
e990: 42 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75  BE     },  /* Mu
e9a0: 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33  st be element [3
e9b0: 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  ] */.      { "UT
e9c0: 46 31 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f  F16le",  SQLITE_
e9d0: 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20  UTF16LE     },. 
e9e0: 20 20 20 20 20 7b 20 22 55 54 46 31 36 62 65 22       { "UTF16be"
e9f0: 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ,  SQLITE_UTF16B
ea00: 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  E     },.      {
ea10: 20 22 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20   "UTF-16",   0  
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46  }, /* SQLITE_UTF
ea40: 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20  16NATIVE */.    
ea50: 20 20 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20    { "UTF16",    
ea60: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
ea70: 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f     }, /* SQLITE_
ea80: 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20  UTF16NATIVE */. 
ea90: 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
eaa0: 20 20 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73    };.    const s
eab0: 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70  truct EncName *p
eac0: 45 6e 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Enc;.    if( !zR
ead0: 69 67 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50  ight ){    /* "P
eae0: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20  RAGMA encoding" 
eaf0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
eb00: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
eb10: 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72  Parse) ) goto pr
eb20: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
eb30: 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73  assert( encnames
eb40: 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e  [SQLITE_UTF8].en
eb50: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c==SQLITE_UTF8 )
eb60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
eb70: 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f  encnames[SQLITE_
eb80: 55 54 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51  UTF16LE].enc==SQ
eb90: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a  LITE_UTF16LE );.
eba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
ebb0: 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54  cnames[SQLITE_UT
ebc0: 46 31 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49  F16BE].enc==SQLI
ebd0: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
ebe0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
ebf0: 54 65 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73  Text(v, encnames
ec00: 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29  [ENC(pParse->db)
ec10: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ].zName);.    }e
ec20: 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
ec40: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
ec50: 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20 20 20 20  = XXX" */.      
ec60: 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74  /* Only change t
ec70: 68 65 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  he value of sqli
ec80: 74 65 2e 65 6e 63 20 69 66 20 74 68 65 20 64 61  te.enc if the da
ec90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69 73  tabase handle is
eca0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e   not.      ** in
ecb0: 69 74 69 61 6c 69 7a 65 64 2e 20 49 66 20 74 68  itialized. If th
ecc0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
ecd0: 65 78 69 73 74 73 2c 20 74 68 65 20 6e 65 77 20  exists, the new 
ece0: 73 71 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75 65  sqlite.enc value
ecf0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
ed00: 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
ed10: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  en the schema is
ed20: 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e 20 49 66   next loaded. If
ed30: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20   it does not.   
ed40: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78     ** already ex
ed50: 69 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 65  ists, it will be
ed60: 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20   created to use 
ed70: 74 68 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67  the new encoding
ed80: 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f   value..      */
ed90: 0a 20 20 20 20 20 20 69 66 28 20 0a 20 20 20 20  .      if( .    
eda0: 20 20 20 20 21 28 44 62 48 61 73 50 72 6f 70 65      !(DbHasPrope
edb0: 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53 63  rty(db, 0, DB_Sc
edc0: 68 65 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20  hemaLoaded)) || 
edd0: 0a 20 20 20 20 20 20 20 20 44 62 48 61 73 50 72  .        DbHasPr
ede0: 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42  operty(db, 0, DB
edf0: 5f 45 6d 70 74 79 29 20 0a 20 20 20 20 20 20 29  _Empty) .      )
ee00: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 45  {.        for(pE
ee10: 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b  nc=&encnames[0];
ee20: 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45   pEnc->zName; pE
ee30: 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  nc++){.         
ee40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
ee50: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 70  trICmp(zRight, p
ee60: 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20  Enc->zName) ){. 
ee70: 20 20 20 20 20 20 20 20 20 20 20 53 43 48 45 4d             SCHEM
ee80: 41 5f 45 4e 43 28 64 62 29 20 3d 20 45 4e 43 28  A_ENC(db) = ENC(
ee90: 64 62 29 20 3d 0a 20 20 20 20 20 20 20 20 20 20  db) =.          
eea0: 20 20 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20        pEnc->enc 
eeb0: 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51  ? pEnc->enc : SQ
eec0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
eed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
eee0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
eef0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ef00: 20 20 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e     if( !pEnc->zN
ef10: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
ef20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ef30: 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70  (pParse, "unsupp
ef40: 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20  orted encoding: 
ef50: 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  %s", zRight);.  
ef60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ef70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
ef80: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
ef90: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
efa0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
efb0: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45  E_OMIT_SCHEMA_VE
efc0: 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  RSION_PRAGMAS.  
efd0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
efe0: 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61   [schema.]schema
eff0: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20  _version.  **   
f000: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f010: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d  schema_version =
f020: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
f030: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
f040: 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73  chema.]user_vers
f050: 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ion.  **   PRAGM
f060: 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f  A [schema.]user_
f070: 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67  version = <integ
f080: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er>.  **.  **   
f090: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f0a0: 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20  freelist_count. 
f0b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
f0c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f  A [schema.]data_
f0d0: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a  version.  **.  *
f0e0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f0f0: 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f  ma.]application_
f100: 69 64 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  id.  **   PRAGMA
f110: 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63   [schema.]applic
f120: 61 74 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65  ation_id = <inte
f130: 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger>.  **.  ** T
f140: 68 65 20 70 72 61 67 6d 61 27 73 20 73 63 68 65  he pragma's sche
f150: 6d 61 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20 75  ma_version and u
f160: 73 65 72 5f 76 65 72 73 69 6f 6e 20 61 72 65 20  ser_version are 
f170: 75 73 65 64 20 74 6f 20 73 65 74 20 6f 72 20 67  used to set or g
f180: 65 74 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  et.  ** the valu
f190: 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2d  e of the schema-
f1a0: 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72  version and user
f1b0: 2d 76 65 72 73 69 6f 6e 2c 20 72 65 73 70 65 63  -version, respec
f1c0: 74 69 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a  tively. Both.  *
f1d0: 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  * the schema-ver
f1e0: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 75 73 65  sion and the use
f1f0: 72 2d 76 65 72 73 69 6f 6e 20 61 72 65 20 33 32  r-version are 32
f200: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
f210: 67 65 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64  gers.  ** stored
f220: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
f230: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20   header..  **.  
f240: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 2d 63 6f  ** The schema-co
f250: 6f 6b 69 65 20 69 73 20 75 73 75 61 6c 6c 79 20  okie is usually 
f260: 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 64  only manipulated
f270: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53   internally by S
f280: 51 4c 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69  QLite. It.  ** i
f290: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  s incremented by
f2a0: 20 53 51 4c 69 74 65 20 77 68 65 6e 65 76 65 72   SQLite whenever
f2b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
f2c0: 68 65 6d 61 20 69 73 20 6d 6f 64 69 66 69 65 64  hema is modified
f2d0: 20 28 62 79 0a 20 20 2a 2a 20 63 72 65 61 74 69   (by.  ** creati
f2e0: 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e 67 20 61  ng or dropping a
f2f0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 29   table or index)
f300: 2e 20 54 68 65 20 73 63 68 65 6d 61 20 76 65 72  . The schema ver
f310: 73 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 0a  sion is used by.
f320: 20 20 2a 2a 20 53 51 4c 69 74 65 20 65 61 63 68    ** SQLite each
f330: 20 74 69 6d 65 20 61 20 71 75 65 72 79 20 69 73   time a query is
f340: 20 65 78 65 63 75 74 65 64 20 74 6f 20 65 6e 73   executed to ens
f350: 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e 74  ure that the int
f360: 65 72 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a  ernal cache.  **
f370: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 75   of the schema u
f380: 73 65 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69  sed when compili
f390: 6e 67 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  ng the SQL query
f3a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 63 68   matches the sch
f3b0: 65 6d 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ema of.  ** the 
f3c0: 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 73 74  database against
f3d0: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 69   which the compi
f3e0: 6c 65 64 20 71 75 65 72 79 20 69 73 20 61 63 74  led query is act
f3f0: 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 0a  ually executed..
f400: 20 20 2a 2a 20 53 75 62 76 65 72 74 69 6e 67 20    ** Subverting 
f410: 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 62  this mechanism b
f420: 79 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  y using "PRAGMA 
f430: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20  schema_version" 
f440: 74 6f 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  to modify.  ** t
f450: 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f  he schema-versio
f460: 6e 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  n is potentially
f470: 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d   dangerous and m
f480: 61 79 20 6c 65 61 64 20 74 6f 20 70 72 6f 67 72  ay lead to progr
f490: 61 6d 0a 20 20 2a 2a 20 63 72 61 73 68 65 73 20  am.  ** crashes 
f4a0: 6f 72 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  or database corr
f4b0: 75 70 74 69 6f 6e 2e 20 55 73 65 20 77 69 74 68  uption. Use with
f4c0: 20 63 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20   caution!.  **. 
f4d0: 20 2a 2a 20 54 68 65 20 75 73 65 72 2d 76 65 72   ** The user-ver
f4e0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65 64  sion is not used
f4f0: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53   internally by S
f500: 51 4c 69 74 65 2e 20 49 74 20 6d 61 79 20 62 65  QLite. It may be
f510: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 61 70   used by.  ** ap
f520: 70 6c 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 61  plications for a
f530: 6e 79 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f  ny purpose..  */
f540: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f550: 48 45 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a  HEADER_VALUE: {.
f560: 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20      int iCookie 
f570: 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b  = pPragma->iArg;
f580: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69    /* Which cooki
f590: 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
f5a0: 74 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  te */.    sqlite
f5b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
f5c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
f5d0: 7a 52 69 67 68 74 20 26 26 20 28 70 50 72 61 67  zRight && (pPrag
f5e0: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
f5f0: 72 61 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29  ragFlg_ReadOnly)
f600: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
f610: 57 72 69 74 65 20 74 68 65 20 73 70 65 63 69 66  Write the specif
f620: 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ied cookie value
f630: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
f640: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
f650: 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20  t setCookie[] = 
f660: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54  {.        { OP_T
f670: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30  ransaction,    0
f680: 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  1,  0},    /*
f690: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   0 */.        { 
f6a0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
f6b0: 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20     0,  0,  0},  
f6c0: 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20    /* 1 */.      
f6d0: 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  };.      VdbeOp 
f6e0: 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  *aOp;.      sqli
f6f0: 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d  te3VdbeVerifyNoM
f700: 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c  allocRequired(v,
f710: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f   ArraySize(setCo
f720: 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f  okie));.      aO
f730: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
f740: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
f750: 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29  ySize(setCookie)
f760: 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b  , setCookie, 0);
f770: 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f  .      if( ONLY_
f780: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
f790: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
f7a0: 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  k;.      aOp[0].
f7b0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
f7c0: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
f7d0: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32  .      aOp[1].p2
f7e0: 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20   = iCookie;.    
f7f0: 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71    aOp[1].p3 = sq
f800: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
f810: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f820: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
f830: 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65  specified cookie
f840: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20   value */.      
f850: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
f860: 65 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b  eOpList readCook
f870: 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ie[] = {.       
f880: 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f   { OP_Transactio
f890: 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  n,     0,  0,  0
f8a0: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
f8b0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
f8c0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
f8d0: 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20  1,  0},    /* 1 
f8e0: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
f8f0: 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20  ResultRow,      
f900: 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20   1,  1,  0}.    
f910: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
f920: 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71  p *aOp;.      sq
f930: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
f940: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
f950: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61  v, ArraySize(rea
f960: 64 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20  dCookie));.     
f970: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
f980: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
f990: 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f  rraySize(readCoo
f9a0: 6b 69 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c  kie),readCookie,
f9b0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e  0);.      if( ON
f9c0: 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54  LY_IF_REALLOC_ST
f9d0: 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62  RESS(aOp==0) ) b
f9e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b  reak;.      aOp[
f9f0: 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  0].p1 = iDb;.   
fa00: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
fa10: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
fa20: 2e 70 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20  .p3 = iCookie;. 
fa30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa40: 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 20  Reusable(v);.   
fa50: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
fa60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fa70: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52  _OMIT_SCHEMA_VER
fa80: 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  SION_PRAGMAS */.
fa90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
faa0: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
fab0: 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20  ON_DIAGS.  /*.  
fac0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70  **   PRAGMA comp
fad0: 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a  ile_options.  **
fae0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
faf0: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f   names of all co
fb00: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
fb10: 6e 73 20 75 73 65 64 20 69 6e 20 74 68 69 73 20  ns used in this 
fb20: 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20  build,.  ** one 
fb30: 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a  option per row..
fb40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
fb50: 54 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49  Typ_COMPILE_OPTI
fb60: 4f 4e 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ONS: {.    int i
fb70: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
fb80: 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
fb90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31  pParse->nMem = 1
fba0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f  ;.    while( (zO
fbb0: 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  pt = sqlite3_com
fbc0: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69  pileoption_get(i
fbd0: 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ++))!=0 ){.     
fbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
fbf0: 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70  String(v, 1, zOp
fc00: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
fc10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fc20: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
fc30: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
fc40: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
fc50: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  e(v);.  }.  brea
fc60: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
fc70: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
fc80: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a  OPTION_DIAGS */.
fc90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fca0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20  OMIT_WAL.  /*.  
fcb0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
fcc0: 65 6d 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f  ema.]wal_checkpo
fcd0: 69 6e 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75  int = passive|fu
fce0: 6c 6c 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63  ll|restart|trunc
fcf0: 61 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  ate.  **.  ** Ch
fd00: 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74  eckpoint the dat
fd10: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
fd20: 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43  se PragTyp_WAL_C
fd30: 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
fd40: 20 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32   int iBt = (pId2
fd50: 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d  ->z?iDb:SQLITE_M
fd60: 41 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20  AX_ATTACHED);.  
fd70: 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51    int eMode = SQ
fd80: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
fd90: 50 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28  PASSIVE;.    if(
fda0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
fdb0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fdc0: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c  Cmp(zRight, "ful
fdd0: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
fde0: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
fdf0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
fe00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
fe10: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fe20: 28 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61 72  (zRight, "restar
fe30: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
fe40: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
fe50: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
fe60: 41 52 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ART;.      }else
fe70: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fe80: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 74 72 75  Cmp(zRight, "tru
fe90: 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ncate")==0 ){.  
fea0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51        eMode = SQ
feb0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
fec0: 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20  TRUNCATE;.      
fed0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
fee0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20  se->nMem = 3;.  
fef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ff00: 4f 70 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  Op3(v, OP_Checkp
ff10: 6f 69 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65  oint, iBt, eMode
ff20: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
ff30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ff40: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
ff50: 33 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  3);.  }.  break;
ff60: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
ff70: 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65  AGMA wal_autoche
ff80: 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50  ckpoint.  **   P
ff90: 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68  RAGMA wal_autoch
ffa0: 65 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a  eckpoint = N.  *
ffb0: 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65  *.  ** Configure
ffc0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
ffd0: 65 63 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61  ection to automa
ffe0: 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
fff0: 6e 74 20 61 20 64 61 74 61 62 61 73 65 0a 20 20  nt a database.  
10000 2a 2a 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c  ** after accumul
10010 61 74 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69  ating N frames i
10020 6e 20 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75  n the log. Or qu
10030 65 72 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  ery for the curr
10040 65 6e 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  ent value.  ** o
10050 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  f N..  */.  case
10060 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54   PragTyp_WAL_AUT
10070 4f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20  OCHECKPOINT: {. 
10080 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
10090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77  .      sqlite3_w
100a0 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
100b0 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f  t(db, sqlite3Ato
100c0 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  i(zRight));.    
100d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
100e0 6c 65 49 6e 74 28 76 2c 20 0a 20 20 20 20 20 20  leInt(v, .      
100f0 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
10100 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c 44 65 66  k==sqlite3WalDef
10110 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20  aultHook ? .    
10120 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 54         SQLITE_PT
10130 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61  R_TO_INT(db->pWa
10140 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a  lArg) : 0);.  }.
10150 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
10160 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
10170 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79  MA shrink_memory
10180 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
10190 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
101a0 32 33 34 34 35 2d 34 36 31 30 39 20 54 68 69 73  23445-46109 This
101b0 20 70 72 61 67 6d 61 20 63 61 75 73 65 73 20 74   pragma causes t
101c0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
101d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77   connection on w
101e0 68 69 63 68 20 69 74 20 69 73 20 69 6e 76 6f 6b  hich it is invok
101f0 65 64 20 74 6f 20 66 72 65 65 20 75 70 20 61 73  ed to free up as
10200 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
10210 69 74 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20  it.  ** can, by 
10220 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
10230 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
10240 79 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  y()..  */.  case
10250 20 50 72 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f   PragTyp_SHRINK_
10260 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71  MEMORY: {.    sq
10270 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
10280 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20  _memory(db);.   
10290 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
102a0 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f  *.  **  PRAGMA o
102b0 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ptimize.  **  PR
102c0 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65 28 4d 41  AGMA optimize(MA
102d0 53 4b 29 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  SK).  **  PRAGMA
102e0 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65   schema.optimize
102f0 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63  .  **  PRAGMA sc
10300 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 28 4d 41  hema.optimize(MA
10310 53 4b 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74  SK).  **.  ** At
10320 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a  tempt to optimiz
10330 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
10340 20 41 6c 6c 20 73 63 68 65 6d 61 73 20 61 72 65   All schemas are
10350 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74 68   optimized in th
10360 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
10370 20 66 6f 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79   forms, and only
10380 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73   the specified s
10390 63 68 65 6d 61 20 69 73 20 6f 70 74 69 6d 69 7a  chema is optimiz
103a0 65 64 20 69 6e 20 74 68 65 20 6c 61 74 74 65 72  ed in the latter
103b0 20 74 77 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   two..  **.  ** 
103c0 54 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20 6f  The details of o
103d0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 70 65 72  ptimizations per
103e0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 70  formed by this p
103f0 72 61 67 6d 61 20 61 72 65 20 65 78 70 65 63 74  ragma are expect
10400 65 64 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67  ed.  ** to chang
10410 65 20 61 6e 64 20 69 6d 70 72 6f 76 65 20 6f 76  e and improve ov
10420 65 72 20 74 69 6d 65 2e 20 20 41 70 70 6c 69 63  er time.  Applic
10430 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 61 6e  ations should an
10440 74 69 63 69 70 61 74 65 20 74 68 61 74 0a 20 20  ticipate that.  
10450 2a 2a 20 74 68 69 73 20 70 72 61 67 6d 61 20 77  ** this pragma w
10460 69 6c 6c 20 70 65 72 66 6f 72 6d 20 6e 65 77 20  ill perform new 
10470 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
10480 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73   future releases
10490 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
104a0 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e  optional argumen
104b0 74 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  t is a bitmask o
104c0 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  f optimizations 
104d0 74 6f 20 70 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a  to perform:.  **
104e0 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 31 20  .  **    0x0001 
104f0 20 20 20 44 65 62 75 67 67 69 6e 67 20 6d 6f 64     Debugging mod
10500 65 2e 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61  e.  Do not actua
10510 6c 6c 79 20 70 65 72 66 6f 72 6d 20 61 6e 79 20  lly perform any 
10520 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 20 20  optimizations.  
10530 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10540 62 75 74 20 69 6e 73 74 65 61 64 20 72 65 74 75  but instead retu
10550 72 6e 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74  rn one line of t
10560 65 78 74 20 66 6f 72 20 65 61 63 68 20 6f 70 74  ext for each opt
10570 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 20  imization.  **  
10580 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
10590 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
105a0 20 64 6f 6e 65 2e 20 20 4f 66 66 20 62 79 20 64   done.  Off by d
105b0 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a  efault..  **.  *
105c0 2a 20 20 20 20 30 78 30 30 30 32 20 20 20 20 52  *    0x0002    R
105d0 75 6e 20 41 4e 41 4c 59 5a 45 20 6f 6e 20 74 61  un ANALYZE on ta
105e0 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
105f0 62 65 6e 65 66 69 74 2e 20 20 4f 6e 20 62 79 20  benefit.  On by 
10600 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 20 20 20  default..  **   
10610 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20 62             See b
10620 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f  elow for additio
10630 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
10640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
10650 30 30 30 34 20 20 20 20 28 4e 6f 74 20 79 65 74  0004    (Not yet
10660 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 52 65   implemented) Re
10670 63 6f 72 64 20 75 73 61 67 65 20 61 6e 64 20 70  cord usage and p
10680 65 72 66 6f 72 6d 61 6e 63 65 20 0a 20 20 2a 2a  erformance .  **
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
106a0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
106b0 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69  he current sessi
106c0 6f 6e 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 20  on in the.  **  
106d0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
106e0 62 61 73 65 20 66 69 6c 65 20 73 6f 20 74 68 61  base file so tha
106f0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61 76 61  t it will be ava
10700 69 6c 61 62 6c 65 20 74 6f 20 22 6f 70 74 69 6d  ilable to "optim
10710 69 7a 65 22 0a 20 20 2a 2a 20 20 20 20 20 20 20  ize".  **       
10720 20 20 20 20 20 20 20 70 72 61 67 6d 61 73 20 72         pragmas r
10730 75 6e 20 62 79 20 66 75 74 75 72 65 20 64 61 74  un by future dat
10740 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10750 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s..  **.  **    
10760 30 78 30 30 30 38 20 20 20 20 28 4e 6f 74 20 79  0x0008    (Not y
10770 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20  et implemented) 
10780 43 72 65 61 74 65 20 69 6e 64 65 78 65 73 20 74  Create indexes t
10790 68 61 74 20 6d 69 67 68 74 20 68 61 76 65 0a 20  hat might have. 
107a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
107b0 20 62 65 65 6e 20 68 65 6c 70 66 75 6c 20 74 6f   been helpful to
107c0 20 72 65 63 65 6e 74 20 71 75 65 72 69 65 73 0a   recent queries.
107d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65    **.  ** The de
107e0 66 61 75 6c 74 20 4d 41 53 4b 20 69 73 20 61 6e  fault MASK is an
107f0 64 20 61 6c 77 61 79 73 20 73 68 61 6c 6c 20 62  d always shall b
10800 65 20 30 78 66 66 66 65 2e 20 20 30 78 66 66 66  e 0xfffe.  0xfff
10810 65 20 6d 65 61 6e 73 20 70 65 72 66 6f 72 6d 20  e means perform 
10820 61 6c 6c 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  all.  ** of the 
10830 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
10840 73 74 65 64 20 61 62 6f 76 65 20 65 78 63 65 70  sted above excep
10850 74 20 44 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e  t Debug Mode, in
10860 63 6c 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a  cluding new.  **
10870 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
10880 68 61 74 20 68 61 76 65 20 6e 6f 74 20 79 65 74  hat have not yet
10890 20 62 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20   been invented. 
108a0 20 49 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61   If new optimiza
108b0 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65  tions are.  ** e
108c0 76 65 72 20 61 64 64 65 64 20 74 68 61 74 20 73  ver added that s
108d0 68 6f 75 6c 64 20 62 65 20 6f 66 66 20 62 79 20  hould be off by 
108e0 64 65 66 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f  default, those o
108f0 66 66 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a 20  ff-by-default . 
10900 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
10910 73 20 77 69 6c 6c 20 68 61 76 65 20 62 69 74 6d  s will have bitm
10920 61 73 6b 73 20 6f 66 20 30 78 31 30 30 30 30 20  asks of 0x10000 
10930 6f 72 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a  or larger..  **.
10940 20 20 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54 49    ** DETERMINATI
10950 4f 4e 20 4f 46 20 57 48 45 4e 20 54 4f 20 52 55  ON OF WHEN TO RU
10960 4e 20 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20  N ANALYZE.  **. 
10970 20 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   ** In the curre
10980 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
10990 6e 2c 20 61 20 74 61 62 6c 65 20 69 73 20 61 6e  n, a table is an
109a0 61 6c 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69  alyzed if only i
109b0 66 20 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68  f all of.  ** th
109c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
109d0 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
109e0 28 31 29 20 4d 41 53 4b 20 62 69 74 20 30 78 30  (1) MASK bit 0x0
109f0 32 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20  2 is set..  **. 
10a00 20 2a 2a 20 28 32 29 20 54 68 65 20 71 75 65 72   ** (2) The quer
10a10 79 20 70 6c 61 6e 6e 65 72 20 75 73 65 64 20 73  y planner used s
10a20 71 6c 69 74 65 5f 73 74 61 74 31 2d 73 74 79 6c  qlite_stat1-styl
10a30 65 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  e statistics for
10a40 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20   one or.  **    
10a50 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66   more indexes of
10a60 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 73 6f   the table at so
10a70 6d 65 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20  me point during 
10a80 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
10a90 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72    **     the cur
10aa0 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  rent connection.
10ab0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f  .  **.  ** (3) O
10ac0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78  ne or more index
10ad0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
10ae0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  are currently un
10af0 61 6e 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a  analyzed OR.  **
10b00 20 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20       the number 
10b10 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
10b20 61 62 6c 65 20 68 61 73 20 69 6e 63 72 65 61 73  able has increas
10b30 65 64 20 62 79 20 32 35 20 74 69 6d 65 73 20 6f  ed by 25 times o
10b40 72 20 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20  r more.  **     
10b50 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74  since the last t
10b60 69 6d 65 20 41 4e 41 4c 59 5a 45 20 77 61 73 20  ime ANALYZE was 
10b70 72 75 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  run..  **.  ** T
10b80 68 65 20 72 75 6c 65 73 20 66 6f 72 20 77 68 65  he rules for whe
10b90 6e 20 74 61 62 6c 65 73 20 61 72 65 20 61 6e 61  n tables are ana
10ba0 6c 79 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c 79  lyzed are likely
10bb0 20 74 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20 20   to change in.  
10bc0 2a 2a 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  ** future releas
10bd0 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  es..  */.  case 
10be0 50 72 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45  PragTyp_OPTIMIZE
10bf0 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 4c  : {.    int iDbL
10c00 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ast;           /
10c10 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  * Loop terminati
10c20 6f 6e 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65  on point for the
10c30 20 73 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a   schema loop */.
10c40 20 20 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b      int iTabCur;
10c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
10c60 72 73 6f 72 20 66 6f 72 20 61 20 74 61 62 6c 65  rsor for a table
10c70 20 77 68 6f 73 65 20 73 69 7a 65 20 6e 65 65 64   whose size need
10c80 73 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  s checking */.  
10c90 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
10ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10cb0 20 6f 76 65 72 20 74 61 62 6c 65 73 20 6f 66 20   over tables of 
10cc0 61 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  a schema */.    
10cd0 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b  Schema *pSchema;
10ce0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
10cf0 72 72 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a  rrent schema */.
10d00 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
10d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10d20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
10d30 65 6d 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ema */.    Index
10d40 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
10d50 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66    /* An index of
10d60 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
10d70 20 20 4c 6f 67 45 73 74 20 73 7a 54 68 72 65 73    LogEst szThres
10d80 68 6f 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65  hold;    /* Size
10d90 20 74 68 72 65 73 68 6f 6c 64 20 61 62 6f 76 65   threshold above
10da0 20 77 68 69 63 68 20 72 65 61 6e 61 6c 79 73 69   which reanalysi
10db0 73 20 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20  s is needd */.  
10dc0 20 20 63 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b    char *zSubSql;
10dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
10de0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68  statement for th
10df0 65 20 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70 63  e OP_SqlExec opc
10e00 6f 64 65 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f  ode */.    u32 o
10e10 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
10e20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65    /* Mask of ope
10e30 72 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f  rations to perfo
10e40 72 6d 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a  rm */..    if( z
10e50 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 6f  Right ){.      o
10e60 70 4d 61 73 6b 20 3d 20 28 75 33 32 29 73 71 6c  pMask = (u32)sql
10e70 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
10e80 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 4d  ;.      if( (opM
10e90 61 73 6b 20 26 20 30 78 30 32 29 3d 3d 30 20 29  ask & 0x02)==0 )
10ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
10eb0 65 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  e{.      opMask 
10ec0 3d 20 30 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a  = 0xfffe;.    }.
10ed0 20 20 20 20 69 54 61 62 43 75 72 20 3d 20 70 50      iTabCur = pP
10ee0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
10ef0 20 20 66 6f 72 28 69 44 62 4c 61 73 74 20 3d 20    for(iDbLast = 
10f00 7a 44 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d  zDb?iDb:db->nDb-
10f10 31 3b 20 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b  1; iDb<=iDbLast;
10f20 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69   iDb++){.      i
10f30 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74  f( iDb==1 ) cont
10f40 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  inue;.      sqli
10f50 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10f60 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
10f70 3b 0a 20 20 20 20 20 20 70 53 63 68 65 6d 61 20  ;.      pSchema 
10f80 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
10f90 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f  Schema;.      fo
10fa0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
10fb0 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
10fc0 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c  lHash); k; k=sql
10fd0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
10fe0 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
10ff0 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
11000 73 68 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20  shData(k);..    
11010 20 20 20 20 2f 2a 20 49 66 20 74 61 62 6c 65 20      /* If table 
11020 70 54 61 62 20 68 61 73 20 6e 6f 74 20 62 65 65  pTab has not bee
11030 6e 20 75 73 65 64 20 69 6e 20 61 20 77 61 79 20  n used in a way 
11040 74 68 61 74 20 77 6f 75 6c 64 20 62 65 6e 65 66  that would benef
11050 69 74 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  it from.        
11060 2a 2a 20 68 61 76 69 6e 67 20 61 6e 61 6c 79 73  ** having analys
11070 69 73 20 73 74 61 74 69 73 74 69 63 73 20 64 75  is statistics du
11080 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
11090 20 73 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73   session, then s
110a0 6b 69 70 20 69 74 2e 0a 20 20 20 20 20 20 20 20  kip it..        
110b0 2a 2a 20 54 68 69 73 20 61 6c 73 6f 20 68 61 73  ** This also has
110c0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 73   the effect of s
110d0 6b 69 70 70 69 6e 67 20 76 69 72 74 75 61 6c 20  kipping virtual 
110e0 74 61 62 6c 65 73 20 61 6e 64 20 76 69 65 77 73  tables and views
110f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
11100 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
11110 26 20 54 46 5f 53 74 61 74 73 55 73 65 64 29 3d  & TF_StatsUsed)=
11120 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
11130 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 6e 61          /* Reana
11140 6c 79 7a 65 20 69 66 20 74 68 65 20 74 61 62 6c  lyze if the tabl
11150 65 20 69 73 20 32 35 20 74 69 6d 65 73 20 6c 61  e is 25 times la
11160 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
11170 73 74 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20  st analysis */. 
11180 20 20 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f         szThresho
11190 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ld = pTab->nRowL
111a0 6f 67 45 73 74 20 2b 20 34 36 3b 20 61 73 73 65  ogEst + 46; asse
111b0 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  rt( sqlite3LogEs
111c0 74 28 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20  t(25)==46 );.   
111d0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
111e0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
111f0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
11200 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
11210 66 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61  f( !pIdx->hasSta
11220 74 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t1 ){.          
11230 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20    szThreshold = 
11240 30 3b 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61  0; /* Always ana
11250 6c 79 7a 65 20 69 66 20 61 6e 79 20 69 6e 64 65  lyze if any inde
11260 78 20 6c 61 63 6b 73 20 73 74 61 74 69 73 74 69  x lacks statisti
11270 63 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  cs */.          
11280 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
112a0 20 20 20 20 20 20 20 69 66 28 20 73 7a 54 68 72         if( szThr
112b0 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20  eshold ){.      
112c0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
112d0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
112e0 62 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  bCur, iDb, pTab,
112f0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
11300 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11310 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11320 5f 49 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62  _IfSmaller, iTab
11330 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11350 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11360 74 41 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61  tAddr(v)+2+(opMa
11370 73 6b 26 31 29 2c 20 73 7a 54 68 72 65 73 68 6f  sk&1), szThresho
11380 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ld);.          V
11390 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
113a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
113b0 20 20 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c 69    zSubSql = sqli
113c0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
113d0 41 4e 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c  ANALYZE \"%w\".\
113e0 22 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  "%w\"",.        
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
11410 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
11420 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
11430 20 20 20 20 20 20 69 66 28 20 6f 70 4d 61 73 6b        if( opMask
11440 20 26 20 30 78 30 31 20 29 7b 0a 20 20 20 20 20   & 0x01 ){.     
11450 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
11460 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
11470 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
11480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11490 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
114a0 67 38 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53  g8, 0, r1, 0, zS
114b0 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49  ubSql, P4_DYNAMI
114c0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  C);.          sq
114d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
114e0 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
114f0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
11500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11520 4f 70 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65  Op4(v, OP_SqlExe
11530 63 2c 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62  c, 0, 0, 0, zSub
11540 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Sql, P4_DYNAMIC)
11550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
11570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
11580 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
11590 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
115a0 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
115b0 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20  A busy_timeout. 
115c0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73   **   PRAGMA bus
115d0 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20  y_timeout = N.  
115e0 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c  **.  ** Call sql
115f0 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
11600 74 28 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72  t(db, N).  Retur
11610 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  n the current ti
11620 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a  meout value.  **
11630 20 69 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20   if one is set. 
11640 20 49 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64   If no busy hand
11650 6c 65 72 20 6f 72 20 61 20 64 69 66 66 65 72 65  ler or a differe
11660 6e 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  nt busy handler 
11670 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e  is set.  ** then
11680 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
11690 20 53 65 74 74 69 6e 67 20 74 68 65 20 62 75 73   Setting the bus
116a0 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f  y_timeout to 0 o
116b0 72 20 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20  r negative.  ** 
116c0 64 69 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d  disables the tim
116d0 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63  eout..  */.  /*c
116e0 61 73 65 20 50 72 61 67 54 79 70 5f 42 55 53 59  ase PragTyp_BUSY
116f0 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75  _TIMEOUT*/ defau
11700 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lt: {.    assert
11710 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67  ( pPragma->ePrag
11720 54 79 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53  Typ==PragTyp_BUS
11730 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20  Y_TIMEOUT );.   
11740 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
11750 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
11760 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71  y_timeout(db, sq
11770 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
11780 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
11790 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
117a0 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
117b0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
117c0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
117d0 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f  RAGMA soft_heap_
117e0 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41  limit.  **   PRA
117f0 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
11800 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  mit = N.  **.  *
11810 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
11820 2d 4f 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39  -OF: R-26343-459
11830 33 30 20 54 68 69 73 20 70 72 61 67 6d 61 20 69  30 This pragma i
11840 6e 76 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20  nvokes the.  ** 
11850 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
11860 70 5f 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65  p_limit64() inte
11870 72 66 61 63 65 20 77 69 74 68 20 74 68 65 20 61  rface with the a
11880 72 67 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20  rgument N, if N 
11890 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  is.  ** specifie
118a0 64 20 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e  d and is a non-n
118b0 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
118c0 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
118d0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31  TION-OF: R-64451
118e0 2d 30 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f  -07163 The soft_
118f0 68 65 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d  heap_limit pragm
11900 61 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65  a always.  ** re
11910 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69  turns the same i
11920 6e 74 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c  nteger that woul
11930 64 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  d be returned by
11940 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
11950 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
11960 74 36 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61  t64(-1) C-langua
11970 67 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ge function..  *
11980 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
11990 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54  _SOFT_HEAP_LIMIT
119a0 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
119b0 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28  int64 N;.    if(
119c0 20 7a 52 69 67 68 74 20 26 26 20 73 71 6c 69 74   zRight && sqlit
119d0 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
119e0 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c  zRight, &N)==SQL
119f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11a00 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
11a10 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20  p_limit64(N);.  
11a20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
11a30 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
11a40 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11a50 69 74 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62  it64(-1));.    b
11a60 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
11a70 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68    **   PRAGMA th
11a80 72 65 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41  reads.  **   PRA
11a90 47 4d 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a  GMA threads = N.
11aa0 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
11ab0 75 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ure the maximum 
11ac0 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72  number of worker
11ad0 20 74 68 72 65 61 64 73 2e 20 20 52 65 74 75 72   threads.  Retur
11ae0 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d  n the new.  ** m
11af0 61 78 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69  aximum, which mi
11b00 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
11b10 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
11b20 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
11b30 54 48 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73  THREADS: {.    s
11b40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a  qlite3_int64 N;.
11b50 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20      if( zRight. 
11b60 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 44 65      && sqlite3De
11b70 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
11b80 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f  ht, &N)==SQLITE_
11b90 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a  OK.     && N>=0.
11ba0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11bb0 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
11bc0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
11bd0 45 52 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74  ER_THREADS, (int
11be0 29 28 4e 26 30 78 37 66 66 66 66 66 66 66 29 29  )(N&0x7fffffff))
11bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
11c00 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
11c10 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
11c20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
11c30 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31  RKER_THREADS, -1
11c40 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
11c50 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
11c60 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
11c70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11c80 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  TEST).  /*.  ** 
11c90 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
11ca0 6e 74 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65  nt state of file
11cb0 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61   logs for all da
11cc0 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63  tabases.  */.  c
11cd0 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b  ase PragTyp_LOCK
11ce0 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73  _STATUS: {.    s
11cf0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
11d00 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61   *const azLockNa
11d10 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22  me[] = {.      "
11d20 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72  unlocked", "shar
11d30 65 64 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c  ed", "reserved",
11d40 20 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63   "pending", "exc
11d50 6c 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20  lusive".    };. 
11d60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50     int i;.    pP
11d70 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a  arse->nMem = 2;.
11d80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
11d90 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
11da0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
11db0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11dc0 20 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e   *zState = "unkn
11dd0 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20  own";.      int 
11de0 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  j;.      if( db-
11df0 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
11e00 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
11e10 20 20 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e        pBt = db->
11e20 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11e30 20 20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20    if( pBt==0 || 
11e40 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
11e50 72 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  r(pBt)==0 ){.   
11e60 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63       zState = "c
11e70 6c 6f 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65  losed";.      }e
11e80 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
11e90 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
11ea0 20 69 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   i ? db->aDb[i].
11eb0 7a 44 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20  zDbSName : 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 20                  
11ee0 20 20 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c      SQLITE_FCNTL
11ef0 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d  _LOCKSTATE, &j)=
11f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11f10 20 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20         zState = 
11f20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20  azLockName[j];. 
11f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11f40 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
11f50 64 28 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62  d(v, 1, "ss", db
11f60 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
11f70 65 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20  e, zState);.    
11f80 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
11f90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
11fa0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
11fb0 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20 20 20 20  .  /* Pragma    
11fc0 20 20 20 20 69 41 72 67 0a 20 20 2a 2a 20 2d 2d      iArg.  ** --
11fd0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d  --------   -----
11fe0 2d 0a 20 20 2a 2a 20 20 6b 65 79 20 20 20 20 20  -.  **  key     
11ff0 20 20 20 20 20 20 30 0a 20 20 2a 2a 20 20 72 65        0.  **  re
12000 6b 65 79 20 20 20 20 20 20 20 20 20 31 0a 20 20  key         1.  
12010 2a 2a 20 20 68 65 78 6b 65 79 20 20 20 20 20 20  **  hexkey      
12020 20 20 32 0a 20 20 2a 2a 20 20 68 65 78 72 65 6b    2.  **  hexrek
12030 65 79 20 20 20 20 20 20 33 0a 20 20 2a 2a 20 20  ey      3.  **  
12040 74 65 78 74 6b 65 79 20 20 20 20 20 20 20 34 0a  textkey       4.
12050 20 20 2a 2a 20 20 74 65 78 74 72 65 6b 65 79 20    **  textrekey 
12060 20 20 20 20 35 0a 20 20 2a 2f 0a 20 20 63 61 73      5.  */.  cas
12070 65 20 50 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b  e PragTyp_KEY: {
12080 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
12090 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
120a0 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3c 34   pPragma->iArg<4
120b0 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   ? sqlite3Strlen
120c0 33 30 28 7a 52 69 67 68 74 29 20 3a 20 2d 31 3b  30(zRight) : -1;
120d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 72 61  .      if( (pPra
120e0 67 6d 61 2d 3e 69 41 72 67 20 26 20 31 29 3d 3d  gma->iArg & 1)==
120f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
12100 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
12110 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 6e 29 3b  zDb, zRight, n);
12120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
12140 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  key_v2(db, zDb, 
12150 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20  zRight, n);.    
12160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
12170 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20  eak;.  }.  case 
12180 50 72 61 67 54 79 70 5f 48 45 58 4b 45 59 3a 20  PragTyp_HEXKEY: 
12190 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
121a0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79   ){.      u8 iBy
121b0 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  te;.      int i;
121c0 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b 65 79  .      char zKey
121d0 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  [40];.      for(
121e0 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c  i=0, iByte=0; i<
121f0 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26  sizeof(zKey)*2 &
12200 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
12210 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b  t(zRight[i]); i+
12220 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74  +){.        iByt
12230 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b  e = (iByte<<4) +
12240 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
12250 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20  (zRight[i]);.   
12260 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d       if( (i&1)!=
12270 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20  0 ) zKey[i/2] = 
12280 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  iByte;.      }. 
12290 20 20 20 20 20 69 66 28 20 28 70 50 72 61 67 6d       if( (pPragm
122a0 61 2d 3e 69 41 72 67 20 26 20 31 29 3d 3d 30 20  a->iArg & 1)==0 
122b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
122c0 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
122d0 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20  b, zKey, i/2);. 
122e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
122f0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65      sqlite3_reke
12300 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
12310 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20  ey, i/2);.      
12320 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
12330 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  k;.  }.#endif.#i
12340 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
12350 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64  _HAS_CODEC) || d
12360 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12370 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63 61  ABLE_CEROD).  ca
12380 73 65 20 50 72 61 67 54 79 70 5f 41 43 54 49 56  se PragTyp_ACTIV
12390 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a 20  ATE_EXTENSIONS: 
123a0 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 23 69  if( zRight ){.#i
123b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
123c0 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 73 71  CODEC.    if( sq
123d0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52  lite3StrNICmp(zR
123e0 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20 34 29  ight, "see-", 4)
123f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
12400 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73 65  ite3_activate_se
12410 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a 20  e(&zRight[4]);. 
12420 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64     }.#endif.#ifd
12430 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12440 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28 20 73  _CEROD.    if( s
12450 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
12460 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d 22 2c  Right, "cerod-",
12470 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   6)==0 ){.      
12480 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65  sqlite3_activate
12490 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74 5b 36  _cerod(&zRight[6
124a0 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ]);.    }.#endif
124b0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
124c0 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64  ndif..  } /* End
124d0 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 73   of the PRAGMA s
124e0 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54  witch */..  /* T
124f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
12500 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  ck is a no-op un
12510 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55  less SQLITE_DEBU
12520 47 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49 74  G is defined. It
12530 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72 70  s only.  ** purp
12540 6f 73 65 20 69 73 20 74 6f 20 65 78 65 63 75 74  ose is to execut
12550 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
12560 6d 65 6e 74 73 20 74 6f 20 76 65 72 69 66 79 20  ments to verify 
12570 74 68 61 74 20 69 66 20 74 68 65 0a 20 20 2a 2a  that if the.  **
12580 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d   PragFlg_NoColum
12590 6e 73 31 20 66 6c 61 67 20 69 73 20 73 65 74 20  ns1 flag is set 
125a0 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 73  and the caller s
125b0 70 65 63 69 66 69 65 64 20 61 6e 20 61 72 67 75  pecified an argu
125c0 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ment.  ** to the
125d0 20 50 52 41 47 4d 41 2c 20 74 68 65 20 69 6d 70   PRAGMA, the imp
125e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73 20  lementation has 
125f0 6e 6f 74 20 61 64 64 65 64 20 61 6e 79 20 4f 50  not added any OP
12600 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a 2a  _ResultRow .  **
12610 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 6f   instructions to
12620 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20 69   the VM.  */.  i
12630 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
12640 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
12650 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20 7a  NoColumns1) && z
12660 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
12670 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
12680 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
12690 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20  }..pragma_out:. 
126a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
126b0 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c  b, zLeft);.  sql
126c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
126d0 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65  Right);.}.#ifnde
126e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
126f0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a  RTUALTABLE./****
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 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70  *********.** Imp
12750 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
12760 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  n eponymous virt
12770 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72  ual table that r
12780 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a  uns a pragma..**
12790 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
127a0 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 50 72  ct PragmaVtab Pr
127b0 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65  agmaVtab;.typede
127c0 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  f struct PragmaV
127d0 74 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61  tabCursor Pragma
127e0 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75  VtabCursor;.stru
127f0 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a  ct PragmaVtab {.
12800 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62    sqlite3_vtab b
12810 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ase;        /* B
12820 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
12830 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
12840 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
12850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12860 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12870 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20  ion to which it 
12880 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e  belongs */.  con
12890 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
128a0 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
128b0 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  f the pragma */.
128c0 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20    u8 nHidden;   
128d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
128e0 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20  umber of hidden 
128f0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
12900 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20  iHidden;        
12910 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12920 6f 66 20 74 68 65 20 66 69 72 73 74 20 68 69 64  of the first hid
12930 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b  den column */.};
12940 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74  .struct PragmaVt
12950 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  abCursor {.  sql
12960 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
12970 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63   base; /* Base c
12980 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66  lass.  Must be f
12990 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
129a0 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b  3_stmt *pPragma;
129b0 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d      /* The pragm
129c0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  a statement to r
129d0 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69  un */.  sqlite_i
129e0 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20  nt64 iRowid;    
129f0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
12a00 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a  id */.  char *az
12a10 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  Arg[2];         
12a20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
12a30 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  e argument and s
12a40 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  chema */.};../* 
12a50 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
12a60 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
12a70 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e  xConnect method.
12a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12a90 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
12aa0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12ab0 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
12ac0 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
12ad0 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
12ae0 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
12af0 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
12b00 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
12b10 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
12b20 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e   *pPragma = (con
12b30 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70  st PragmaName*)p
12b40 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  Aux;.  PragmaVta
12b50 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69  b *pTab = 0;.  i
12b60 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
12b70 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d  j;.  char cSep =
12b80 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d   '(';.  StrAccum
12b90 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75   acc;.  char zBu
12ba0 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45  f[200];..  UNUSE
12bb0 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
12bc0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12bd0 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20 73  METER(argv);.  s
12be0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
12bf0 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 75 66  it(&acc, 0, zBuf
12c00 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
12c10 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  0);.  sqlite3_st
12c20 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63  r_appendall(&acc
12c30 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
12c40 78 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  x");.  for(i=0, 
12c50 6a 3d 70 50 72 61 67 6d 61 2d 3e 69 50 72 61 67  j=pPragma->iPrag
12c60 43 4e 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61  CName; i<pPragma
12c70 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b  ->nPragCName; i+
12c80 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  +, j++){.    sql
12c90 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
12ca0 28 26 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22  (&acc, "%c\"%s\"
12cb0 22 2c 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61  ", cSep, pragCNa
12cc0 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70  me[j]);.    cSep
12cd0 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66   = ',';.  }.  if
12ce0 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( i==0 ){.    sq
12cf0 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
12d00 66 28 26 61 63 63 2c 20 22 28 5c 22 25 73 5c 22  f(&acc, "(\"%s\"
12d10 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d  ", pPragma->zNam
12d20 65 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  e);.    i++;.  }
12d30 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  j = 0;.  if( 
12d40 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
12d50 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75  g & PragFlg_Resu
12d60 6c 74 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lt1 ){.    sqlit
12d70 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
12d80 28 26 61 63 63 2c 20 22 2c 61 72 67 20 48 49 44  (&acc, ",arg HID
12d90 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  DEN");.    j++;.
12da0 20 20 7d 0a 20 20 69 66 28 20 70 50 72 61 67 6d    }.  if( pPragm
12db0 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 28 50  a->mPragFlg & (P
12dc0 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74  ragFlg_SchemaOpt
12dd0 7c 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 52  |PragFlg_SchemaR
12de0 65 71 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eq) ){.    sqlit
12df0 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
12e00 28 26 61 63 63 2c 20 22 2c 73 63 68 65 6d 61 20  (&acc, ",schema 
12e10 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b  HIDDEN");.    j+
12e20 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
12e30 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 61 63 63  _str_append(&acc
12e40 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c  , ")", 1);.  sql
12e50 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
12e60 73 68 28 26 61 63 63 29 3b 0a 20 20 61 73 73 65  sh(&acc);.  asse
12e70 72 74 28 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  rt( strlen(zBuf)
12e80 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   < sizeof(zBuf)-
12e90 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 );.  rc = sqli
12ea0 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
12eb0 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66  (db, zBuf);.  if
12ec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12ed0 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 28 50  ){.    pTab = (P
12ee0 72 61 67 6d 61 56 74 61 62 2a 29 73 71 6c 69 74  ragmaVtab*)sqlit
12ef0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
12f00 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20  (PragmaVtab));. 
12f10 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
12f20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
12f30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
12f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
12f50 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65  et(pTab, 0, size
12f60 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b  of(PragmaVtab));
12f70 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 4e 61  .      pTab->pNa
12f80 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20  me = pPragma;.  
12f90 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64      pTab->db = d
12fa0 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  b;.      pTab->i
12fb0 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20  Hidden = i;.    
12fc0 20 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20    pTab->nHidden 
12fd0 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = j;.    }.  }el
12fe0 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d  se{.    *pzErr =
12ff0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13000 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
13010 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
13020 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71  .  *ppVtab = (sq
13030 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 54 61 62  lite3_vtab*)pTab
13040 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13050 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20  ../* .** Pragma 
13060 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
13070 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74  dule xDisconnect
13080 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
13090 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
130a0 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69  bDisconnect(sqli
130b0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
130c0 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a  {.  PragmaVtab *
130d0 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74  pTab = (PragmaVt
130e0 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c  ab*)pVtab;.  sql
130f0 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b  ite3_free(pTab);
13100 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13110 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72  _OK;.}../* Figur
13120 65 20 6f 75 74 20 74 68 65 20 62 65 73 74 20 69  e out the best i
13130 6e 64 65 78 20 74 6f 20 75 73 65 20 74 6f 20 73  ndex to use to s
13140 65 61 72 63 68 20 61 20 70 72 61 67 6d 61 20 76  earch a pragma v
13150 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
13160 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f  .** There are no
13170 74 20 72 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64  t really any ind
13180 65 78 20 63 68 6f 69 63 65 73 2e 20 20 42 75 74  ex choices.  But
13190 20 77 65 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f   we want to enco
131a0 75 72 61 67 65 20 74 68 65 0a 2a 2a 20 71 75 65  urage the.** que
131b0 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69  ry planner to gi
131c0 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  ve == constraint
131d0 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20 68 69 64  s on as many hid
131e0 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61  den parameters a
131f0 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61  s.** possible, a
13200 6e 64 20 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e  nd especially on
13210 20 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65   the first hidde
13220 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 6f  n parameter.  So
13230 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67   return a.** hig
13240 68 20 63 6f 73 74 20 69 66 20 68 69 64 64 65 6e  h cost if hidden
13250 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
13260 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a  unconstrained..*
13270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13280 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78  gmaVtabBestIndex
13290 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74  (sqlite3_vtab *t
132a0 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
132b0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
132c0 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  ){.  PragmaVtab 
132d0 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
132e0 74 61 62 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73  tab*)tab;.  cons
132f0 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  t struct sqlite3
13300 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
13310 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  t *pConstraint;.
13320 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
13330 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49  t seen[2];..  pI
13340 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
13350 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29  dCost = (double)
13360 31 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  1;.  if( pTab->n
13370 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74  Hidden==0 ){ ret
13380 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d  urn SQLITE_OK; }
13390 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  pConstraint =
133a0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
133b0 74 72 61 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30  traint;.  seen[0
133c0 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d  ] = 0;.  seen[1]
133d0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
133e0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
133f0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
13400 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20  Constraint++){. 
13410 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
13420 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20  nt->usable==0 ) 
13430 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13440 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  ( pConstraint->o
13450 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p!=SQLITE_INDEX_
13460 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20  CONSTRAINT_EQ ) 
13470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13480 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  ( pConstraint->i
13490 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69  Column < pTab->i
134a0 48 69 64 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75  Hidden ) continu
134b0 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73  e;.    j = pCons
134c0 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20  traint->iColumn 
134d0 2d 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b  - pTab->iHidden;
134e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c  .    assert( j <
134f0 20 32 20 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a   2 );.    seen[j
13500 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69  ] = i+1;.  }.  i
13510 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b  f( seen[0]==0 ){
13520 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
13530 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
13540 64 6f 75 62 6c 65 29 32 31 34 37 34 38 33 36 34  double)214748364
13550 37 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  7;.    pIdxInfo-
13560 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
13570 20 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20   2147483647;.   
13580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13590 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65  K;.  }.  j = see
135a0 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e  n[0]-1;.  pIdxIn
135b0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
135c0 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65  sage[j].argvInde
135d0 78 20 3d 20 31 3b 0a 20 20 70 49 64 78 49 6e 66  x = 1;.  pIdxInf
135e0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
135f0 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b  age[j].omit = 1;
13600 0a 20 20 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d  .  if( seen[1]==
13610 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
13620 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f  E_OK;.  pIdxInfo
13630 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
13640 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20  = (double)20;.  
13650 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
13660 74 65 64 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20  tedRows = 20;.  
13670 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20  j = seen[1]-1;. 
13680 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13690 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61  traintUsage[j].a
136a0 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  rgvIndex = 2;.  
136b0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
136c0 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d  raintUsage[j].om
136d0 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  it = 1;.  return
136e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
136f0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
13700 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 70 72  ursor for the pr
13710 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
13720 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
13730 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 28   pragmaVtabOpen(
13740 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
13750 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  tab, sqlite3_vta
13760 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
13770 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  sor){.  PragmaVt
13780 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  abCursor *pCsr;.
13790 20 20 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61    pCsr = (Pragma
137a0 56 74 61 62 43 75 72 73 6f 72 2a 29 73 71 6c 69  VtabCursor*)sqli
137b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
137c0 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 69 66 28  f(*pCsr));.  if(
137d0 20 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72   pCsr==0 ) retur
137e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
137f0 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30    memset(pCsr, 0
13800 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56  , sizeof(PragmaV
13810 74 61 62 43 75 72 73 6f 72 29 29 3b 0a 20 20 70  tabCursor));.  p
13820 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20  Csr->base.pVtab 
13830 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70 70 43 75  = pVtab;.  *ppCu
13840 72 73 6f 72 20 3d 20 26 70 43 73 72 2d 3e 62 61  rsor = &pCsr->ba
13850 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  se;.  return SQL
13860 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c  ITE_OK;.}../* Cl
13870 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  ear all content 
13880 66 72 6f 6d 20 70 72 61 67 6d 61 20 76 69 72 74  from pragma virt
13890 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
138a0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
138b0 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   pragmaVtabCurso
138c0 72 43 6c 65 61 72 28 50 72 61 67 6d 61 56 74 61  rClear(PragmaVta
138d0 62 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a  bCursor *pCsr){.
138e0 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
138f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72  e3_finalize(pCsr
13900 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20 70 43  ->pPragma);.  pC
13910 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b  sr->pPragma = 0;
13920 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
13930 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a  raySize(pCsr->az
13940 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Arg); i++){.    
13950 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
13960 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  r->azArg[i]);.  
13970 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d    pCsr->azArg[i]
13980 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20   = 0;.  }.}../* 
13990 43 6c 6f 73 65 20 61 20 70 72 61 67 6d 61 20 76  Close a pragma v
139a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
139b0 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sor */.static in
139c0 74 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73  t pragmaVtabClos
139d0 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e(sqlite3_vtab_c
139e0 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50  ursor *cur){.  P
139f0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
13a00 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
13a10 74 61 62 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  tabCursor*)cur;.
13a20 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73    pragmaVtabCurs
13a30 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20  orClear(pCsr);. 
13a40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
13a50 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  sr);.  return SQ
13a60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41  LITE_OK;.}../* A
13a70 64 76 61 6e 63 65 20 74 68 65 20 70 72 61 67 6d  dvance the pragm
13a80 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13a90 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
13aa0 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63  xt row */.static
13ab0 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4e   int pragmaVtabN
13ac0 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ext(sqlite3_vtab
13ad0 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
13ae0 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  rsor){.  PragmaV
13af0 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
13b00 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
13b10 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72  sor*)pVtabCursor
13b20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13b30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e  ITE_OK;..  /* In
13b40 63 72 65 6d 65 6e 74 20 74 68 65 20 78 52 6f 77  crement the xRow
13b50 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43  id value */.  pC
13b60 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20  sr->iRowid++;.  
13b70 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 50  assert( pCsr->pP
13b80 72 61 67 6d 61 20 29 3b 0a 20 20 69 66 28 20 53  ragma );.  if( S
13b90 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74  QLITE_ROW!=sqlit
13ba0 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 50  e3_step(pCsr->pP
13bb0 72 61 67 6d 61 29 20 29 7b 0a 20 20 20 20 72 63  ragma) ){.    rc
13bc0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
13bd0 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  ize(pCsr->pPragm
13be0 61 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 50  a);.    pCsr->pP
13bf0 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70  ragma = 0;.    p
13c00 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
13c10 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a  lear(pCsr);.  }.
13c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13c30 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
13c40 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
13c50 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  le xFilter metho
13c60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13c70 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65   pragmaVtabFilte
13c80 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r(.  sqlite3_vta
13c90 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
13ca0 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64  ursor, .  int id
13cb0 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  xNum, const char
13cc0 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20   *idxStr,.  int 
13cd0 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
13ce0 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
13cf0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13d00 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
13d10 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
13d20 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d  bCursor;.  Pragm
13d30 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50  aVtab *pTab = (P
13d40 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61  ragmaVtab*)(pVta
13d50 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b  bCursor->pVtab);
13d60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
13d70 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41 63 63 75   i, j;.  StrAccu
13d80 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a  m acc;.  char *z
13d90 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  Sql;..  UNUSED_P
13da0 41 52 41 4d 45 54 45 52 28 69 64 78 4e 75 6d 29  ARAMETER(idxNum)
13db0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
13dc0 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20  ETER(idxStr);.  
13dd0 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  pragmaVtabCursor
13de0 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 6a  Clear(pCsr);.  j
13df0 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61 6d 65 2d   = (pTab->pName-
13e00 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
13e10 46 6c 67 5f 52 65 73 75 6c 74 31 29 21 3d 30 20  Flg_Result1)!=0 
13e20 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f 72 28 69  ? 0 : 1;.  for(i
13e30 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 2c  =0; i<argc; i++,
13e40 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   j++){.    const
13e50 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28   char *zText = (
13e60 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
13e70 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
13e80 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73  rgv[i]);.    ass
13e90 65 72 74 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ert( j<ArraySize
13ea0 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b  (pCsr->azArg) );
13eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73  .    assert( pCs
13ec0 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29  r->azArg[j]==0 )
13ed0 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74 20  ;.    if( zText 
13ee0 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61  ){.      pCsr->a
13ef0 7a 41 72 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65  zArg[j] = sqlite
13f00 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
13f10 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  zText);.      if
13f20 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d  ( pCsr->azArg[j]
13f30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
13f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13f50 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
13f60 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  }.  }.  sqlite3S
13f70 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63  trAccumInit(&acc
13f80 2c 20 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  , 0, 0, 0, pTab-
13f90 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
13fa0 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
13fb0 47 54 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  GTH]);.  sqlite3
13fc0 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
13fd0 61 63 63 2c 20 22 50 52 41 47 4d 41 20 22 29 3b  acc, "PRAGMA ");
13fe0 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41  .  if( pCsr->azA
13ff0 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71 6c  rg[1] ){.    sql
14000 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
14010 28 26 61 63 63 2c 20 22 25 51 2e 22 2c 20 70 43  (&acc, "%Q.", pC
14020 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  sr->azArg[1]);. 
14030 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72   }.  sqlite3_str
14040 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
14050 20 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e   pTab->pName->zN
14060 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72  ame);.  if( pCsr
14070 2d 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20  ->azArg[0] ){.  
14080 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
14090 70 65 6e 64 66 28 26 61 63 63 2c 20 22 3d 25 51  pendf(&acc, "=%Q
140a0 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30  ", pCsr->azArg[0
140b0 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d  ]);.  }.  zSql =
140c0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
140d0 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20  Finish(&acc);.  
140e0 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
140f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14100 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  M;.  rc = sqlite
14110 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 54 61  3_prepare_v2(pTa
14120 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
14130 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c   &pCsr->pPragma,
14140 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
14150 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
14160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14170 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65  {.    pTab->base
14180 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  .zErrMsg = sqlit
14190 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
141a0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
141b0 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  pTab->db));.    
141c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
141d0 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61 56 74   return pragmaVt
141e0 61 62 4e 65 78 74 28 70 56 74 61 62 43 75 72 73  abNext(pVtabCurs
141f0 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  or);.}../*.** Pr
14200 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
14210 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d  le module xEof m
14220 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
14230 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 45   int pragmaVtabE
14240 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
14250 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
14260 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  sor){.  PragmaVt
14270 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
14280 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
14290 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
142a0 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d  .  return (pCsr-
142b0 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a  >pPragma==0);.}.
142c0 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20  ./* The xColumn 
142d0 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20 72 65  method simply re
142e0 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73  turns the corres
142f0 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66  ponding column f
14300 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d  rom.** the PRAGM
14310 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  A.  .*/.static i
14320 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c  nt pragmaVtabCol
14330 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  umn(.  sqlite3_v
14340 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
14350 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69  bCursor, .  sqli
14360 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
14370 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20  , .  int i.){.  
14380 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
14390 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
143a0 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
143b0 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d  bCursor;.  Pragm
143c0 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50  aVtab *pTab = (P
143d0 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61  ragmaVtab*)(pVta
143e0 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b  bCursor->pVtab);
143f0 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d 3e 69  .  if( i<pTab->i
14400 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20 73 71  Hidden ){.    sq
14410 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
14420 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f  ue(ctx, sqlite3_
14430 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73  column_value(pCs
14440 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29 29 3b  r->pPragma, i));
14450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
14460 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
14470 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41  t(ctx, pCsr->azA
14480 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69 64 64  rg[i-pTab->iHidd
14490 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52  en],-1,SQLITE_TR
144a0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
144b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
144c0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  ;.}../* .** Prag
144d0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
144e0 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64 20 6d   module xRowid m
144f0 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
14500 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 52   int pragmaVtabR
14510 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
14520 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
14530 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e  ursor, sqlite_in
14540 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d  t64 *p){.  Pragm
14550 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
14560 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
14570 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
14580 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d  or;.  *p = pCsr-
14590 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72  >iRowid;.  retur
145a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
145b0 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 76 69  /* The pragma vi
145c0 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65  rtual table obje
145d0 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  ct */.static con
145e0 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
145f0 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f 64 75  e pragmaVtabModu
14600 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14620 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
14630 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d      /* xCreate -
14660 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
14670 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
14680 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
14690 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20    /* xConnect - 
146a0 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78  connect to an ex
146b0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  isting table */.
146c0 20 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74    pragmaVtabBest
146d0 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f  Index,         /
146e0 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20 44  * xBestIndex - D
146f0 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63 68 20  etermine search 
14700 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 70 72  strategy */.  pr
14710 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65  agmaVtabDisconne
14720 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ct,        /* xD
14730 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63  isconnect - Disc
14740 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20 74 61  onnect from a ta
14750 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ble */.  0,     
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f        /* xDestro
14780 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65  y - Drop a table
14790 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
147a0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
147b0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
147c0 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
147d0 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65   pragmaVtabClose
147e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
147f0 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
14800 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72  a cursor */.  pr
14810 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 2c 20  agmaVtabFilter, 
14820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
14830 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
14840 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
14850 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  ts */.  pragmaVt
14860 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  abNext,         
14870 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20       /* xNext - 
14880 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72  advance a cursor
14890 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
148a0 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Eof,            
148b0 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20     /* xEof */.  
148c0 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e  pragmaVtabColumn
148d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
148e0 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
148f0 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ata */.  pragmaV
14900 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20 20 20  tabRowid,       
14910 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20        /* xRowid 
14920 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
14930 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14950 20 78 55 70 64 61 74 65 20 2d 20 77 72 69 74 65   xUpdate - write
14960 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
14990 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61  n - begin transa
149a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
149d0 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74   - sync transact
149e0 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
14a10 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61   - commit transa
14a20 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
14a50 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20  back - rollback 
14a60 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
14a70 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a90 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d   xFindFunction -
14aa0 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
14ab0 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20  ading */.  0,   
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
14ae0 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20  me - rename the 
14af0 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20  table */.  0,   
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65          /* xSave
14b20 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20  point */.  0,   
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
14b50 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ase */.  0,     
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
14b80 63 6b 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20 20  ckTo */.  0     
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f         /* xShado
14bb0 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  wName */.};../*.
14bc0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
14bd0 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20 72  if zTabName is r
14be0 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f  eally the name o
14bf0 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66 20  f a pragma.  If 
14c00 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20 72  it is,.** then r
14c10 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e 79  egister an epony
14c20 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
14c30 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72 61 67  le for that prag
14c40 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ma and return.**
14c50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
14c60 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20  e Module object 
14c70 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72 74  for the new virt
14c80 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f  ual table..*/.Mo
14c90 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72 61  dule *sqlite3Pra
14ca0 67 6d 61 56 74 61 62 52 65 67 69 73 74 65 72 28  gmaVtabRegister(
14cb0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
14cc0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
14cd0 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
14ce0 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61 73  ame *pName;.  as
14cf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74  sert( sqlite3_st
14d00 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70  rnicmp(zName, "p
14d10 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29  ragma_", 7)==0 )
14d20 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61 67  ;.  pName = prag
14d30 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b 37  maLocate(zName+7
14d40 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d  );.  if( pName==
14d50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
14d60 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72 61  if( (pName->mPra
14d70 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f  gFlg & (PragFlg_
14d80 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67 5f  Result0|PragFlg_
14d90 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20 72  Result1))==0 ) r
14da0 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
14db0 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  t( sqlite3HashFi
14dc0 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
14dd0 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20   zName)==0 );.  
14de0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 74  return sqlite3Vt
14df0 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 64  abCreateModule(d
14e00 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67 6d  b, zName, &pragm
14e10 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76 6f  aVtabModule, (vo
14e20 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d  id*)pName, 0);.}
14e30 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
14e40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14e50 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  ABLE */..#endif 
14e60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
14e70 52 41 47 4d 41 20 2a 2f 0a                       RAGMA */.