/ Hex Artifact Content
Login

Artifact 5a23557e490e7ac5afef097efc4b59dce5b482c2:


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 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 2c 20   upr, lwr, mid, 
2260: 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20  rc;.  lwr = 0;. 
2270: 20 75 70 72 20 3d 20 41 72 72 61 79 53 69 7a 65   upr = ArraySize
2280: 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 2d 31 3b  (aPragmaName)-1;
2290: 0a 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75  .  while( lwr<=u
22a0: 70 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20  pr ){.    mid = 
22b0: 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20  (lwr+upr)/2;.   
22c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
22d0: 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 50 72  ricmp(zName, aPr
22e0: 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d 2e 7a 4e  agmaName[mid].zN
22f0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
2300: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2310: 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
2320: 20 20 20 75 70 72 20 3d 20 6d 69 64 20 2d 20 31     upr = mid - 1
2330: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2340: 20 20 20 6c 77 72 20 3d 20 6d 69 64 20 2b 20 31     lwr = mid + 1
2350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2360: 74 75 72 6e 20 6c 77 72 3e 75 70 72 20 3f 20 30  turn lwr>upr ? 0
2370: 20 3a 20 26 61 50 72 61 67 6d 61 4e 61 6d 65 5b   : &aPragmaName[
2380: 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  mid];.}../*.** P
2390: 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20  rocess a pragma 
23a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
23b0: 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f  ** Pragmas are o
23c0: 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a  f this form:.**.
23d0: 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 5b  **      PRAGMA [
23e0: 73 63 68 65 6d 61 2e 5d 69 64 20 5b 3d 20 76 61  schema.]id [= va
23f0: 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lue].**.** The i
2400: 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74 20  dentifier might 
2410: 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e 67  also be a string
2420: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  .  The value is 
2430: 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a  a string, and.**
2440: 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20   identifier, or 
2450: 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d 69  a number.  If mi
2460: 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65 2c  nusFlag is true,
2470: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
2480: 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74  is.** a number t
2490: 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65 64  hat was preceded
24a0: 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e   by a minus sign
24b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
24c0: 65 66 74 20 73 69 64 65 20 69 73 20 22 64 61 74  eft side is "dat
24d0: 61 62 61 73 65 2e 69 64 22 20 74 68 65 6e 20 70  abase.id" then p
24e0: 49 64 31 20 69 73 20 74 68 65 20 64 61 74 61 62  Id1 is the datab
24f0: 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 61 6e 64 20  ase name.** and 
2500: 70 49 64 32 20 69 73 20 74 68 65 20 69 64 2e 20  pId2 is the id. 
2510: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
2520: 65 20 69 73 20 6a 75 73 74 20 22 69 64 22 20 74  e is just "id" t
2530: 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65 0a  hen pId1 is the.
2540: 2a 2a 20 69 64 20 61 6e 64 20 70 49 64 32 20 69  ** id and pId2 i
2550: 73 20 61 6e 79 20 65 6d 70 74 79 20 73 74 72 69  s any empty stri
2560: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
2570: 74 65 33 50 72 61 67 6d 61 28 0a 20 20 50 61 72  te3Pragma(.  Par
2580: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 54  se *pParse, .  T
2590: 6f 6b 65 6e 20 2a 70 49 64 31 2c 20 20 20 20 20  oken *pId1,     
25a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
25b0: 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20   of [schema.]id 
25c0: 66 69 65 6c 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  field */.  Token
25d0: 20 2a 70 49 64 32 2c 20 20 20 20 20 20 20 20 2f   *pId2,        /
25e0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
25f0: 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20 66 69 65   [schema.]id fie
2600: 6c 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ld, or NULL */. 
2610: 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 75 65 2c 20   Token *pValue, 
2620: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 66 6f       /* Token fo
2630: 72 20 3c 76 61 6c 75 65 3e 2c 20 6f 72 20 4e 55  r <value>, or NU
2640: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 75  LL */.  int minu
2650: 73 46 6c 61 67 20 20 20 20 20 20 20 2f 2a 20 54  sFlag       /* T
2660: 72 75 65 20 69 66 20 61 20 27 2d 27 20 73 69 67  rue if a '-' sig
2670: 6e 20 70 72 65 63 65 64 65 64 20 3c 76 61 6c 75  n preceded <valu
2680: 65 3e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  e> */.){.  char 
2690: 2a 7a 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *zLeft = 0;     
26a0: 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
26b0: 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67  ted UTF-8 string
26c0: 20 3c 69 64 3e 20 2a 2f 0a 20 20 63 68 61 72 20   <id> */.  char 
26d0: 2a 7a 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  *zRight = 0;    
26e0: 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
26f0: 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67  ted UTF-8 string
2700: 20 3c 76 61 6c 75 65 3e 2c 20 6f 72 20 4e 55 4c   <value>, or NUL
2710: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
2720: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a  r *zDb = 0;   /*
2730: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   The database na
2740: 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  me */.  Token *p
2750: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
2760: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 3c 69 64  * Pointer to <id
2770: 3e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 63 68 61  > token */.  cha
2780: 72 20 2a 61 46 63 6e 74 6c 5b 34 5d 3b 20 20 20  r *aFcntl[4];   
2790: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
27a0: 74 6f 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  to SQLITE_FCNTL_
27b0: 50 52 41 47 4d 41 20 2a 2f 0a 20 20 69 6e 74 20  PRAGMA */.  int 
27c0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
27d0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
27e0: 6e 64 65 78 20 66 6f 72 20 3c 64 61 74 61 62 61  ndex for <databa
27f0: 73 65 3e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  se> */.  int rc;
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
2820: 76 61 6c 75 65 20 66 6f 72 6d 20 53 51 4c 49 54  value form SQLIT
2830: 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a  E_FCNTL_PRAGMA *
2840: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
2850: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
2860: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2870: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2880: 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a0: 20 54 68 65 20 73 70 65 63 69 66 69 63 20 64 61   The specific da
28b0: 74 61 62 61 73 65 20 62 65 69 6e 67 20 70 72 61  tabase being pra
28c0: 67 6d 61 65 64 20 2a 2f 0a 20 20 56 64 62 65 20  gmaed */.  Vdbe 
28d0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
28e0: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 2f 2a  dbe(pParse);  /*
28f0: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
2900: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50  ent */.  const P
2910: 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61 67  ragmaName *pPrag
2920: 6d 61 3b 20 20 20 2f 2a 20 54 68 65 20 70 72 61  ma;   /* The pra
2930: 67 6d 61 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d  gma */..  if( v=
2940: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
2950: 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c  qlite3VdbeRunOnl
2960: 79 4f 6e 63 65 28 76 29 3b 0a 20 20 70 50 61 72  yOnce(v);.  pPar
2970: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 0a 20  se->nMem = 2;.. 
2980: 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68   /* Interpret th
2990: 65 20 5b 73 63 68 65 6d 61 2e 5d 20 70 61 72 74  e [schema.] part
29a0: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 73   of the pragma s
29b0: 74 61 74 65 6d 65 6e 74 2e 20 69 44 62 20 69 73  tatement. iDb is
29c0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
29d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
29e0: 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20 62  this pragma is b
29f0: 65 69 6e 67 20 61 70 70 6c 69 65 64 20 74 6f 20  eing applied to 
2a00: 69 6e 20 64 62 2e 61 44 62 5b 5d 2e 20 2a 2f 0a  in db.aDb[]. */.
2a10: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
2a20: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
2a30: 65 2c 20 70 49 64 31 2c 20 70 49 64 32 2c 20 26  e, pId1, pId2, &
2a40: 70 49 64 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  pId);.  if( iDb<
2a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 44  0 ) return;.  pD
2a60: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
2a70: 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ];..  /* If the 
2a80: 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 68 61  temp database ha
2a90: 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  s been explicitl
2aa0: 79 20 6e 61 6d 65 64 20 61 73 20 70 61 72 74 20  y named as part 
2ab0: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 72 61  of the .  ** pra
2ac0: 67 6d 61 2c 20 6d 61 6b 65 20 73 75 72 65 20 69  gma, make sure i
2ad0: 74 20 69 73 20 6f 70 65 6e 2e 20 0a 20 20 2a 2f  t is open. .  */
2ae0: 0a 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26  .  if( iDb==1 &&
2af0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
2b00: 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29  Database(pParse)
2b10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
2b20: 20 20 7d 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73    }..  zLeft = s
2b30: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
2b40: 6b 65 6e 28 64 62 2c 20 70 49 64 29 3b 0a 20 20  ken(db, pId);.  
2b50: 69 66 28 20 21 7a 4c 65 66 74 20 29 20 72 65 74  if( !zLeft ) ret
2b60: 75 72 6e 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  urn;.  if( minus
2b70: 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69 67  Flag ){.    zRig
2b80: 68 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ht = sqlite3MPri
2b90: 6e 74 66 28 64 62 2c 20 22 2d 25 54 22 2c 20 70  ntf(db, "-%T", p
2ba0: 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Value);.  }else{
2bb0: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2bc0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
2bd0: 65 6e 28 64 62 2c 20 70 56 61 6c 75 65 29 3b 0a  en(db, pValue);.
2be0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
2bf0: 49 64 32 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70  Id2 );.  zDb = p
2c00: 49 64 32 2d 3e 6e 3e 30 20 3f 20 70 44 62 2d 3e  Id2->n>0 ? pDb->
2c10: 7a 44 62 53 4e 61 6d 65 20 3a 20 30 3b 0a 20 20  zDbSName : 0;.  
2c20: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
2c30: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2c40: 49 54 45 5f 50 52 41 47 4d 41 2c 20 7a 4c 65 66  ITE_PRAGMA, zLef
2c50: 74 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 20  t, zRight, zDb) 
2c60: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67  ){.    goto prag
2c70: 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ma_out;.  }..  /
2c80: 2a 20 53 65 6e 64 20 61 6e 20 53 51 4c 49 54 45  * Send an SQLITE
2c90: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2ca0: 6c 65 2d 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  le-control to th
2cb0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53  e underlying VFS
2cc0: 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  .  ** connection
2cd0: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
2ce0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
2cf0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2d00: 20 56 46 53 0a 20 20 2a 2a 20 68 61 6e 64 6c 65   VFS.  ** handle
2d10: 64 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64  d the pragma and
2d20: 20 67 65 6e 65 72 61 74 65 20 61 20 6e 6f 2d 6f   generate a no-o
2d30: 70 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  p prepared state
2d40: 6d 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ment..  **.  ** 
2d50: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
2d60: 46 3a 20 52 2d 31 32 32 33 38 2d 35 35 31 32 30  F: R-12238-55120
2d70: 20 57 68 65 6e 65 76 65 72 20 61 20 50 52 41 47   Whenever a PRAG
2d80: 4d 41 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  MA statement is 
2d90: 70 61 72 73 65 64 2c 0a 20 20 2a 2a 20 61 6e 20  parsed,.  ** an 
2da0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2db0: 47 4d 41 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c  GMA file control
2dc0: 20 69 73 20 73 65 6e 74 20 74 6f 20 74 68 65 20   is sent to the 
2dd0: 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  open sqlite3_fil
2de0: 65 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 63 6f  e.  ** object co
2df0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
2e00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e10: 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 70 72   to which the pr
2e20: 61 67 6d 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  agma.  ** statem
2e30: 65 6e 74 20 72 65 66 65 72 73 2e 0a 20 20 2a 2a  ent refers..  **
2e40: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2e50: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 39 38 37 35  TION-OF: R-29875
2e60: 2d 33 31 36 37 38 20 54 68 65 20 61 72 67 75 6d  -31678 The argum
2e70: 65 6e 74 20 74 6f 20 74 68 65 20 53 51 4c 49 54  ent to the SQLIT
2e80: 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 0a 20  E_FCNTL_PRAGMA. 
2e90: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c   ** file control
2ea0: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
2eb0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
2ec0: 6e 67 73 20 28 63 68 61 72 2a 2a 29 20 69 6e 20  ngs (char**) in 
2ed0: 77 68 69 63 68 20 74 68 65 0a 20 20 2a 2a 20 73  which the.  ** s
2ee0: 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66  econd element of
2ef0: 20 74 68 65 20 61 72 72 61 79 20 69 73 20 74 68   the array is th
2f00: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  e name of the pr
2f10: 61 67 6d 61 20 61 6e 64 20 74 68 65 20 74 68 69  agma and the thi
2f20: 72 64 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 20  rd.  ** element 
2f30: 69 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  is the argument 
2f40: 74 6f 20 74 68 65 20 70 72 61 67 6d 61 20 6f 72  to the pragma or
2f50: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 61   NULL if the pra
2f60: 67 6d 61 20 68 61 73 20 6e 6f 0a 20 20 2a 2a 20  gma has no.  ** 
2f70: 61 72 67 75 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  argument..  */. 
2f80: 20 61 46 63 6e 74 6c 5b 30 5d 20 3d 20 30 3b 0a   aFcntl[0] = 0;.
2f90: 20 20 61 46 63 6e 74 6c 5b 31 5d 20 3d 20 7a 4c    aFcntl[1] = zL
2fa0: 65 66 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 32 5d  eft;.  aFcntl[2]
2fb0: 20 3d 20 7a 52 69 67 68 74 3b 0a 20 20 61 46 63   = zRight;.  aFc
2fc0: 6e 74 6c 5b 33 5d 20 3d 20 30 3b 0a 20 20 64 62  ntl[3] = 0;.  db
2fd0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
2fe0: 75 73 79 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  usy = 0;.  rc = 
2ff0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
3000: 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51  trol(db, zDb, SQ
3010: 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d  LITE_FCNTL_PRAGM
3020: 41 2c 20 28 76 6f 69 64 2a 29 61 46 63 6e 74 6c  A, (void*)aFcntl
3030: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
3040: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
3050: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
3060: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73  ols(v, 1);.    s
3070: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
3080: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
3090: 4d 45 5f 4e 41 4d 45 2c 20 61 46 63 6e 74 6c 5b  ME_NAME, aFcntl[
30a0: 30 5d 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  0], SQLITE_TRANS
30b0: 49 45 4e 54 29 3b 0a 20 20 20 20 72 65 74 75 72  IENT);.    retur
30c0: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 61  nSingleText(v, a
30d0: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 73  Fcntl[0]);.    s
30e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
30f0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 67 6f 74 6f  tl[0]);.    goto
3100: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d   pragma_out;.  }
3110: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3120: 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
3130: 20 20 69 66 28 20 61 46 63 6e 74 6c 5b 30 5d 20    if( aFcntl[0] 
3140: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3150: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3160: 20 22 25 73 22 2c 20 61 46 63 6e 74 6c 5b 30 5d   "%s", aFcntl[0]
3170: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3180: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
31a0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
31b0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
31c0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
31d0: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
31e0: 4c 6f 63 61 74 65 20 74 68 65 20 70 72 61 67 6d  Locate the pragm
31f0: 61 20 69 6e 20 74 68 65 20 6c 6f 6f 6b 75 70 20  a in the lookup 
3200: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 50 72 61 67  table */.  pPrag
3210: 6d 61 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61 74  ma = pragmaLocat
3220: 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  e(zLeft);.  if( 
3230: 70 50 72 61 67 6d 61 3d 3d 30 20 29 20 67 6f 74  pPragma==0 ) got
3240: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 0a 20  o pragma_out;.. 
3250: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
3260: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
3270: 61 20 69 73 20 6c 6f 61 64 65 64 20 69 66 20 74  a is loaded if t
3280: 68 65 20 70 72 61 67 6d 61 20 72 65 71 75 69 72  he pragma requir
3290: 65 73 20 74 68 61 74 20 2a 2f 0a 20 20 69 66 28  es that */.  if(
32a0: 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
32b0: 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 65  Flg & PragFlg_Ne
32c0: 65 64 53 63 68 65 6d 61 29 21 3d 30 20 29 7b 0a  edSchema)!=0 ){.
32d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
32e0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
32f0: 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f  ) ) goto pragma_
3300: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  out;.  }..  /* R
3310: 65 67 69 73 74 65 72 20 74 68 65 20 72 65 73 75  egister the resu
3320: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
3330: 66 6f 72 20 70 72 61 67 6d 61 73 20 74 68 61 74  for pragmas that
3340: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 73 20   return results 
3350: 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d  */.  if( (pPragm
3360: 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
3370: 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 29  agFlg_NoColumns)
3380: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 74 50 72  ==0 ){.    setPr
3390: 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e  agmaResultColumn
33a0: 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61  Names(v, pPragma
33b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
33c0: 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  p to the appropr
33d0: 69 61 74 65 20 70 72 61 67 6d 61 20 68 61 6e 64  iate pragma hand
33e0: 6c 65 72 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ler */.  switch(
33f0: 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54   pPragma->ePragT
3400: 79 70 20 29 7b 0a 20 20 0a 23 69 66 20 21 64 65  yp ){.  .#if !de
3410: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3420: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
3430: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
3440: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
3450: 54 45 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TED).  /*.  **  
3460: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
3470: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
3480: 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
3490: 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74  [schema.]default
34a0: 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20  _cache_size=N.  
34b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
34c0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
34d0: 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69  he current persi
34e0: 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  stent setting fo
34f0: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
3500: 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65  cache size.  The
3510: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
3520: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
3530: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
3540: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
3550: 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
3560: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74  nd form sets bot
3570: 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  h the current.  
3580: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
3590: 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  ze value and the
35a0: 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65   persistent page
35b0: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
35c0: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
35d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35e0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c  le..  **.  ** Ol
35f0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
3600: 53 51 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74  SQLite would set
3610: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63   the default cac
3620: 68 65 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a  he size to a.  *
3630: 2a 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  * negative numbe
3640: 72 20 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79  r to indicate sy
3650: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20  nchronous=OFF.  
3660: 54 68 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63  These days, sync
3670: 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20  hronous.  ** is 
3680: 61 6c 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66  always on by def
3690: 61 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20  ault regardless 
36a0: 6f 66 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74  of the sign of t
36b0: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
36c0: 0a 20 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74  .  ** size.  But
36d0: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b   continue to tak
36e0: 65 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  e the absolute v
36f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 64 65 66 61  alue of the defa
3700: 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73  ult cache.  ** s
3710: 69 7a 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61  ize of historica
3720: 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
3730: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
3740: 67 54 79 70 5f 44 45 46 41 55 4c 54 5f 43 41 43  gTyp_DEFAULT_CAC
3750: 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73  HE_SIZE: {.    s
3760: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
3770: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
3780: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
3790: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
37a0: 62 65 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68  beOpList getCach
37b0: 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eSize[] = {.    
37c0: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
37d0: 6f 6e 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  on, 0, 0,       
37e0: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3800: 30 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0 */.      { OP_
3810: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  ReadCookie,  0, 
3820: 31 2c 20 20 20 20 20 20 20 20 42 54 52 45 45 5f  1,        BTREE_
3830: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3840: 5a 45 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  ZE},  /* 1 */.  
3850: 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20      { OP_IfPos, 
3860: 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20        1, 8,     
3870: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
3880: 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30  P_Integer,     0
3890: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
38a0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72        { OP_Subtr
38b0: 61 63 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20  act,    1, 2,   
38c0: 20 20 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b       1},.      {
38d0: 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20   OP_IfPos,      
38e0: 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d   1, 8,        0}
38f0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
3900: 65 67 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20  eger,     0, 1, 
3910: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20         0},      
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20     /* 6 */.     
3940: 20 7b 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20   { OP_Noop,     
3950: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
3960: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
3970: 65 73 75 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31  esultRow,   1, 1
3980: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3990: 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   };.    VdbeOp *
39a0: 61 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  aOp;.    sqlite3
39b0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
39c0: 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
39d0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
39e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
39f0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
3a00: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
3a10: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
3a20: 72 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65  raySize(getCache
3a30: 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 61 4f  Size));.      aO
3a40: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
3a50: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
3a60: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
3a70: 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a  ze), getCacheSiz
3a80: 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69  e, iLn);.      i
3a90: 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c  f( ONLY_IF_REALL
3aa0: 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30  OC_STRESS(aOp==0
3ab0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
3ac0: 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62   aOp[0].p1 = iDb
3ad0: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
3ae0: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
3af0: 4f 70 5b 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54  Op[6].p1 = SQLIT
3b00: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
3b10: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  SIZE;.    }else{
3b20: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
3b30: 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
3b40: 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  2(sqlite3Atoi(zR
3b50: 69 67 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71  ight));.      sq
3b60: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
3b70: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
3b80: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
3b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ba0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
3bb0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 44 45  e, iDb, BTREE_DE
3bc0: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3bd0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61  , size);.      a
3be0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
3bf0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
3c00: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
3c10: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
3c20: 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69  >cache_size = si
3c30: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
3c40: 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
3c50: 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62  ze(pDb->pBt, pDb
3c60: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3c70: 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
3c80: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
3c90: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
3ca0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3cb0: 53 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  S && !SQLITE_OMI
3cc0: 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a  T_DEPRECATED */.
3cd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
3ce0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3cf0: 50 52 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20  PRAGMAS).  /*.  
3d00: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
3d10: 6d 61 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20  ma.]page_size.  
3d20: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
3d30: 6d 61 2e 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a  ma.]page_size=N.
3d40: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
3d50: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
3d60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
3d70: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
3d80: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
3d90: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20  size in bytes.  
3da0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
3db0: 73 65 74 73 20 74 68 65 0a 20 20 2a 2a 20 64 61  sets the.  ** da
3dc0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
3dd0: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 76 61 6c   value.  The val
3de0: 75 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73  ue can only be s
3df0: 65 74 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 64  et if.  ** the d
3e00: 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20  atabase has not 
3e10: 79 65 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  yet been created
3e20: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
3e30: 61 67 54 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a  agTyp_PAGE_SIZE:
3e40: 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42   {.    Btree *pB
3e50: 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20  t = pDb->pBt;.  
3e60: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
3e70: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   );.    if( !zRi
3e80: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ght ){.      int
3e90: 20 73 69 7a 65 20 3d 20 41 4c 57 41 59 53 28 70   size = ALWAYS(p
3ea0: 42 74 29 20 3f 20 73 71 6c 69 74 65 33 42 74 72  Bt) ? sqlite3Btr
3eb0: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeGetPageSize(pB
3ec0: 74 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 72 65  t) : 0;.      re
3ed0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
3ee0: 20 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73   size);.    }els
3ef0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  e{.      /* Mall
3f00: 6f 63 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e  oc may fail when
3f10: 20 73 65 74 74 69 6e 67 20 74 68 65 20 70 61 67   setting the pag
3f20: 65 2d 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65  e-size, as there
3f30: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a   is an internal.
3f40: 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
3f50: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
3f60: 6f 64 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73  odule resizes us
3f70: 69 6e 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  ing sqlite3_real
3f80: 6c 6f 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loc()..      */.
3f90: 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61        db->nextPa
3fa0: 67 65 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  gesize = sqlite3
3fb0: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
3fc0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
3fd0: 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
3fe0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
3ff0: 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
4000: 69 7a 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20  ize,-1,0) ){.   
4010: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
4020: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
4030: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
4040: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
4050: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4060: 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65  a.]secure_delete
4070: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
4080: 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65  chema.]secure_de
4090: 6c 65 74 65 3d 4f 4e 2f 4f 46 46 0a 20 20 2a 2a  lete=ON/OFF.  **
40a0: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
40b0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
40c0: 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
40d0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 65   for the.  ** se
40e0: 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c 61 67  cure_delete flag
40f0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
4100: 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 73  rm changes the s
4110: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a  ecure_delete.  *
4120: 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67 20 61  * flag setting a
4130: 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65 6e 65  nd reports thene
4140: 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  w value..  */.  
4150: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 45 43  case PragTyp_SEC
4160: 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20  URE_DELETE: {.  
4170: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
4180: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 69 6e 74  Db->pBt;.    int
4190: 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73   b = -1;.    ass
41a0: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
41b0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
41c0: 0a 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74  .      b = sqlit
41d0: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
41e0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ght, 0);.    }. 
41f0: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
4200: 30 20 26 26 20 62 3e 3d 30 20 29 7b 0a 20 20 20  0 && b>=0 ){.   
4210: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
4220: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62   for(ii=0; ii<db
4230: 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20  ->nDb; ii++){.  
4240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
4250: 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 64  eeSecureDelete(d
4260: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20  b->aDb[ii].pBt, 
4270: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4280: 7d 0a 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65  }.    b = sqlite
4290: 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
42a0: 74 65 28 70 42 74 2c 20 62 29 3b 0a 20 20 20 20  te(pBt, b);.    
42b0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
42c0: 76 2c 20 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  v, b);.    break
42d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
42e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
42f0: 2e 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  .]max_page_count
4300: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
4310: 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f  chema.]max_page_
4320: 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  count=N.  **.  *
4330: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
4340: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
4350: 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72  rent setting for
4360: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d 75   the.  ** maximu
4370: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
4380: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
4390: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 0a 20 20  e file.  The .  
43a0: 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 61  ** second form a
43b0: 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61 6e 67  ttempts to chang
43c0: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 20  e this setting. 
43d0: 20 42 6f 74 68 0a 20 20 2a 2a 20 66 6f 72 6d 73   Both.  ** forms
43e0: 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
43f0: 65 6e 74 20 73 65 74 74 69 6e 67 2e 0a 20 20 2a  ent setting..  *
4400: 2a 0a 20 20 2a 2a 20 54 68 65 20 61 62 73 6f 6c  *.  ** The absol
4410: 75 74 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 69  ute value of N i
4420: 73 20 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  s used.  This is
4430: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 61 6e   undocumented an
4440: 64 20 6d 69 67 68 74 0a 20 20 2a 2a 20 63 68 61  d might.  ** cha
4450: 6e 67 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 70  nge.  The only p
4460: 75 72 70 6f 73 65 20 69 73 20 74 6f 20 70 72 6f  urpose is to pro
4470: 76 69 64 65 20 61 6e 20 65 61 73 79 20 77 61 79  vide an easy way
4480: 20 74 6f 20 74 65 73 74 0a 20 20 2a 2a 20 74 68   to test.  ** th
4490: 65 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  e sqlite3AbsInt3
44a0: 32 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  2() function..  
44b0: 2a 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  **.  **  PRAGMA 
44c0: 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 63 6f  [schema.]page_co
44d0: 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  unt.  **.  ** Re
44e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
44f0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4500: 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61  specified databa
4510: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
4520: 50 72 61 67 54 79 70 5f 50 41 47 45 5f 43 4f 55  PragTyp_PAGE_COU
4530: 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 52  NT: {.    int iR
4540: 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  eg;.    sqlite3C
4550: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
4560: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
4570: 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73    iReg = ++pPars
4580: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
4590: 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28   sqlite3Tolower(
45a0: 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 70 27 20 29  zLeft[0])=='p' )
45b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
45c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
45d0: 50 61 67 65 63 6f 75 6e 74 2c 20 69 44 62 2c 20  Pagecount, iDb, 
45e0: 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
45f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4600: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4610: 4d 61 78 50 67 63 6e 74 2c 20 69 44 62 2c 20 69  MaxPgcnt, iDb, i
4620: 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Reg, .          
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4640: 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73 71  lite3AbsInt32(sq
4650: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
4660: 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  )));.    }.    s
4670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4680: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
4690: 2c 20 69 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  , iReg, 1);.    
46a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
46b0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
46c0: 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d  chema.]locking_m
46d0: 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ode.  **  PRAGMA
46e0: 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e   [schema.]lockin
46f0: 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f 72 6d 61 6c  g_mode = (normal
4700: 7c 65 78 63 6c 75 73 69 76 65 29 0a 20 20 2a 2f  |exclusive).  */
4710: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4720: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3a 20 7b 0a  LOCKING_MODE: {.
4730: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4740: 7a 52 65 74 20 3d 20 22 6e 6f 72 6d 61 6c 22 3b  zRet = "normal";
4750: 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d  .    int eMode =
4760: 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28   getLockingMode(
4770: 7a 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 69 66  zRight);..    if
4780: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20  ( pId2->n==0 && 
4790: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
47a0: 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 20 29  KINGMODE_QUERY )
47b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6d 70 6c  {.      /* Simpl
47c0: 65 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  e "PRAGMA lockin
47d0: 67 5f 6d 6f 64 65 3b 22 20 73 74 61 74 65 6d 65  g_mode;" stateme
47e0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 71 75  nt. This is a qu
47f0: 65 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ery for.      **
4800: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 65 66   the current def
4810: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  ault locking mod
4820: 65 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  e (which may be 
4830: 64 69 66 66 65 72 65 6e 74 20 74 6f 0a 20 20 20  different to.   
4840: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e     ** the lockin
4850: 67 2d 6d 6f 64 65 20 6f 66 20 74 68 65 20 6d 61  g-mode of the ma
4860: 69 6e 20 64 61 74 61 62 61 73 65 29 2e 0a 20 20  in database)..  
4870: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65 4d 6f      */.      eMo
4880: 64 65 20 3d 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  de = db->dfltLoc
4890: 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65  kMode;.    }else
48a0: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
48b0: 50 61 67 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Pager;.      if(
48c0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pId2->n==0 ){. 
48d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
48e0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6e 6f  ndicates that no
48f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 77   database name w
4900: 61 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  as specified as 
4910: 70 61 72 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  part.        ** 
4920: 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 63 6f  of the PRAGMA co
4930: 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 69 73 20 63  mmand. In this c
4940: 61 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  ase the locking-
4950: 6d 6f 64 65 20 6d 75 73 74 20 62 65 0a 20 20 20  mode must be.   
4960: 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 61       ** set on a
4970: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
4980: 62 61 73 65 73 2c 20 61 73 20 77 65 6c 6c 20 61  bases, as well a
4990: 73 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66 69  s the main db fi
49a0: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  le..        **. 
49b0: 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20         ** Also, 
49c0: 74 68 65 20 73 71 6c 69 74 65 33 2e 64 66 6c 74  the sqlite3.dflt
49d0: 4c 6f 63 6b 4d 6f 64 65 20 76 61 72 69 61 62 6c  LockMode variabl
49e0: 65 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  e is set so that
49f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
4a00: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 61 74 74  subsequently att
4a10: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
4a20: 61 6c 73 6f 20 75 73 65 20 74 68 65 20 73 70 65  also use the spe
4a30: 63 69 66 69 65 64 0a 20 20 20 20 20 20 20 20 2a  cified.        *
4a40: 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  * locking mode..
4a50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4a60: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
4a70: 20 20 20 61 73 73 65 72 74 28 70 44 62 3d 3d 26     assert(pDb==&
4a80: 64 62 2d 3e 61 44 62 5b 30 5d 29 3b 0a 20 20 20  db->aDb[0]);.   
4a90: 20 20 20 20 20 66 6f 72 28 69 69 3d 32 3b 20 69       for(ii=2; i
4aa0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29  i<db->nDb; ii++)
4ab0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
4ac0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
4ad0: 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69  ePager(db->aDb[i
4ae0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 20  i].pBt);.       
4af0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
4b00: 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67 65  ockingMode(pPage
4b10: 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
4b20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d     }.        db-
4b30: 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20  >dfltLockMode = 
4b40: 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20 20 20  (u8)eMode;.     
4b50: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 20   }.      pPager 
4b60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
4b70: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
4b80: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 73 71 6c       eMode = sql
4b90: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4ba0: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4bb0: 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  de);.    }..    
4bc0: 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
4bd0: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
4be0: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
4bf0: 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
4c00: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
4c10: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20  EXCLUSIVE );.   
4c20: 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45   if( eMode==PAGE
4c30: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
4c40: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
4c50: 20 7a 52 65 74 20 3d 20 22 65 78 63 6c 75 73 69   zRet = "exclusi
4c60: 76 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ve";.    }.    r
4c70: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
4c80: 76 2c 20 7a 52 65 74 29 3b 0a 20 20 20 20 62 72  v, zRet);.    br
4c90: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
4ca0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
4cb0: 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  ema.]journal_mod
4cc0: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  e.  **  PRAGMA [
4cd0: 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f  schema.]journal_
4ce0: 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20 20 20  mode =.  **     
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69 73 74   (delete|persist
4d10: 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c 6d 65  |off|truncate|me
4d20: 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a 20 20  mory|wal|off).  
4d30: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4d40: 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f 44 45 3a 20  p_JOURNAL_MODE: 
4d50: 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 3b  {.    int eMode;
4d60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
4d70: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
4d80: 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79 6d 62  NALMODE_XXX symb
4d90: 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ols */.    int i
4da0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;           /* 
4db0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
4dc0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
4dd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
4de0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22 3d  f there is no "=
4df0: 4d 4f 44 45 22 20 70 61 72 74 20 6f 66 20 74 68  MODE" part of th
4e00: 65 20 70 72 61 67 6d 61 2c 20 64 6f 20 61 20 71  e pragma, do a q
4e10: 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20 20  uery for the.   
4e20: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6d 6f     ** current mo
4e30: 64 65 20 2a 2f 0a 20 20 20 20 20 20 65 4d 6f 64  de */.      eMod
4e40: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
4e50: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
4e60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
4e70: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 3b  nst char *zMode;
4e80: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
4e90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4ea0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 66 6f  Right);.      fo
4eb0: 72 28 65 4d 6f 64 65 3d 30 3b 20 28 7a 4d 6f 64  r(eMode=0; (zMod
4ec0: 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
4ed0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4d 6f 64 65  alModename(eMode
4ee0: 29 29 21 3d 30 3b 20 65 4d 6f 64 65 2b 2b 29 7b  ))!=0; eMode++){
4ef0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
4f00: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69  ite3StrNICmp(zRi
4f10: 67 68 74 2c 20 7a 4d 6f 64 65 2c 20 6e 29 3d 3d  ght, zMode, n)==
4f20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4f30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d   }.      if( !zM
4f40: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ode ){.        /
4f50: 2a 20 49 66 20 74 68 65 20 22 3d 4d 4f 44 45 22  * If the "=MODE"
4f60: 20 70 61 72 74 20 64 6f 65 73 20 6e 6f 74 20 6d   part does not m
4f70: 61 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e 20 6a  atch any known j
4f80: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 0a 20 20 20  ournal mode,.   
4f90: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 6f 20       ** then do 
4fa0: 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  a query */.     
4fb0: 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52     eMode = PAGER
4fc0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
4fd0: 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RY;.      }.    
4fe0: 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  }.    if( eMode=
4ff0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
5000: 44 45 5f 51 55 45 52 59 20 26 26 20 70 49 64 32  DE_QUERY && pId2
5010: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->n==0 ){.      
5020: 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52 41 47  /* Convert "PRAG
5030: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22  MA journal_mode"
5040: 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20 6d 61   into "PRAGMA ma
5050: 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22  in.journal_mode"
5060: 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20 3d 20   */.      iDb = 
5070: 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d 3e 6e  0;.      pId2->n
5080: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
5090: 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d 31  for(ii=db->nDb-1
50a0: 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a  ; ii>=0; ii--){.
50b0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
50c0: 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28 69 69  b[ii].pBt && (ii
50d0: 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e  ==iDb || pId2->n
50e0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
50f0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5100: 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20 20 20  tree(v, ii);.   
5110: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5120: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 6f 75  AddOp3(v, OP_Jou
5130: 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20 31 2c  rnalMode, ii, 1,
5140: 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d   eMode);.      }
5150: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5160: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5170: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
5180: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
5190: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
51a0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
51b0: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d  journal_size_lim
51c0: 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  it.  **  PRAGMA 
51d0: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
51e0: 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a 20 20  _size_limit=N.  
51f0: 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73  **.  ** Get or s
5200: 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69  et the size limi
5210: 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  t on rollback jo
5220: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20 20 2a  urnal files..  *
5230: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
5240: 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
5250: 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67 65 72  MIT: {.    Pager
5260: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
5270: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
5280: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36 34 20  ->pBt);.    i64 
5290: 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20 20 20  iLimit = -2;.   
52a0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
52b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f       sqlite3DecO
52c0: 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
52d0: 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  , &iLimit);.    
52e0: 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d 31 20    if( iLimit<-1 
52f0: 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ) iLimit = -1;. 
5300: 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69 74 20     }.    iLimit 
5310: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  = sqlite3PagerJo
5320: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 70  urnalSizeLimit(p
5330: 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29 3b 0a  Pager, iLimit);.
5340: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
5350: 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29 3b 0a  Int(v, iLimit);.
5360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5370: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5380: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
5390: 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  MAS */..  /*.  *
53a0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
53b0: 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d 0a 20  a.]auto_vacuum. 
53c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
53d0: 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ema.]auto_vacuum
53e0: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74  =N.  **.  ** Get
53f0: 20 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c 75   or set the valu
5400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
5410: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
5420: 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2a 20  parameter..  ** 
5430: 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  The value is one
5440: 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31 20 46   of:  0 NONE 1 F
5450: 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e 54 41  ULL 2 INCREMENTA
5460: 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  L.  */.#ifndef S
5470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5480: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5490: 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55 55 4d  gTyp_AUTO_VACUUM
54a0: 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  : {.    Btree *p
54b0: 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20  Bt = pDb->pBt;. 
54c0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d     assert( pBt!=
54d0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  0 );.    if( !zR
54e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
54f0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5500: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
5510: 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 29 29  AutoVacuum(pBt))
5520: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5530: 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d 20 67     int eAuto = g
5540: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a 52 69  etAutoVacuum(zRi
5550: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
5560: 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26 26 20  rt( eAuto>=0 && 
5570: 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20 20 20  eAuto<=2 );.    
5580: 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
5590: 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b 0a 20  c = (u8)eAuto;. 
55a0: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53 65 74       /* Call Set
55b0: 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74 6f 20  AutoVacuum() to 
55c0: 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  set initialize t
55d0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75 74 6f  he internal auto
55e0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e   and.      ** in
55f0: 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67 73 2e  cr-vacuum flags.
5600: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5610: 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 63  d in case this c
5620: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
5630: 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65 20 64  ** creates the d
5640: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
5650: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
5660: 61 74 20 69 74 20 69 73 20 63 72 65 61 74 65 64  at it is created
5670: 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20  .      ** as an 
5680: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
5690: 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20 2a 2f  ble db..      */
56a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
56b0: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
56c0: 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75 74 6f  acuum(pBt, eAuto
56d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
56e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
56f0: 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75 74 6f  Auto==1 || eAuto
5700: 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==2) ){.        
5710: 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e 67 20  /* When setting 
5720: 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  the auto_vacuum 
5730: 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72 20 22  mode to either "
5740: 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20 20 20  full" or .      
5750: 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e 74 61    ** "incrementa
5760: 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20 76 61  l", write the va
5770: 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d 20 69  lue of meta[6] i
5780: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
5790: 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20         ** file. 
57a0: 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  Before writing t
57b0: 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65 63 6b  o meta[6], check
57c0: 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20 69 6e   that meta[3] in
57d0: 64 69 63 61 74 65 73 0a 20 20 20 20 20 20 20 20  dicates.        
57e0: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 65 61  ** that this rea
57f0: 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  lly is an auto-v
5800: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 61  acuum capable da
5810: 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
5820: 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  */.        stati
5830: 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20  c const int iLn 
5840: 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49  = VDBE_OFFSET_LI
5850: 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 20  NENO(2);.       
5860: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
5870: 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65 74 61  beOpList setMeta
5880: 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  6[] = {.        
5890: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
58a0: 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20 20 20  on,    0,       
58b0: 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
58c0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30       0},    /* 0
58d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
58e0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
58f0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c     0,         1,
5900: 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 4c           BTREE_L
5910: 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45  ARGEST_ROOT_PAGE
5920: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f  },.          { O
5930: 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20 20 20  P_If,           
5940: 20 20 31 2c 20 20 20 20 20 20 20 20 20 30 2c 20    1,         0, 
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20  0},    /* 2 */. 
5970: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 48 61           { OP_Ha
5980: 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  lt,           SQ
5990: 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62 6f 72  LITE_OK, OE_Abor
59a0: 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20  t,          0}, 
59b0: 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20     /* 3 */.     
59c0: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
59d0: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 20 20  kie,      0,    
59e0: 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43 52 5f       BTREE_INCR_
59f0: 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20 20 2f  VACUUM, 0},    /
5a00: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  * 4 */.        }
5a10: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  ;.        VdbeOp
5a20: 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *aOp;.        i
5a30: 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
5a40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5a50: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r(v);.        sq
5a60: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
5a70: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
5a80: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74  v, ArraySize(set
5a90: 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20 20 20  Meta6));.       
5aa0: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
5ab0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
5ac0: 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61  rraySize(setMeta
5ad0: 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20 69 4c  6), setMeta6, iL
5ae0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
5af0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
5b00: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
5b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5b20: 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[0].p1 = iDb;
5b30: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  .        aOp[1].
5b40: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5b50: 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20 69 41    aOp[2].p2 = iA
5b60: 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20 20 61  ddr+4;.        a
5b70: 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[4].p1 = iDb;.
5b80: 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70          aOp[4].p
5b90: 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b 0a 20  3 = eAuto - 1;. 
5ba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5bb0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
5bc0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
5bd0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
5be0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
5bf0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5c00: 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74 61 6c  ema.]incremental
5c10: 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a 2a 0a  _vacuum(N).  **.
5c20: 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70 73 20    ** Do N steps 
5c30: 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  of incremental v
5c40: 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20 64 61  acuuming on a da
5c50: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
5c60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5c70: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61  _AUTOVACUUM.  ca
5c80: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43 52 45  se PragTyp_INCRE
5c90: 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a 20 7b  MENTAL_VACUUM: {
5ca0: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c  .    int iLimit,
5cb0: 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28 20 7a   addr;.    if( z
5cc0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73 71 6c  Right==0 || !sql
5cd0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
5ce0: 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20 7c 7c  ght, &iLimit) ||
5cf0: 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20   iLimit<=0 ){.  
5d00: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30 78 37      iLimit = 0x7
5d10: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d 0a 20  fffffff;.    }. 
5d20: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
5d30: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5d40: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
5d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d60: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
5d70: 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b 0a  er, iLimit, 1);.
5d80: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
5d90: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5da0: 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c 20 69  OP_IncrVacuum, i
5db0: 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Db); VdbeCoverag
5dc0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
5dd0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5de0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 29 3b  P_ResultRow, 1);
5df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5e00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
5e10: 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20  Imm, 1, -1);.   
5e20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e30: 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
5e40: 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f  1, addr); VdbeCo
5e50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
5e60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5e70: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
5e80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e90: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
5ea0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5eb0: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
5ec0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
5ed0: 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  ]cache_size.  **
5ee0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5ef0: 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20  .]cache_size=N. 
5f00: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
5f10: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
5f20: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
5f30: 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  l setting for th
5f40: 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  e.  ** page cach
5f50: 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f  e size. The seco
5f60: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65  nd form sets the
5f70: 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65   local.  ** page
5f80: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
5f90: 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f 73 69  e.  If N is posi
5fa0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
5fb0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
5fc0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
5fd0: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
5fe0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
5ff0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6000: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6010: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6020: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6030: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6040: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20  f memory..  */. 
6050: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41   case PragTyp_CA
6060: 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  CHE_SIZE: {.    
6070: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
6080: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
6090: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
60a0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
60b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
60c0: 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 70  gleInt(v, pDb->p
60d0: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
60e0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
60f0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
6100: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
6110: 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ght);.      pDb-
6120: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6130: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  size = size;.   
6140: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
6150: 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d  etCacheSize(pDb-
6160: 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65  >pBt, pDb->pSche
6170: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  ma->cache_size);
6180: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6190: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
61a0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
61b0: 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a 20 20  .]cache_spill.  
61c0: 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65  **  PRAGMA cache
61d0: 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 0a 20  _spill=BOOLEAN. 
61e0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
61f0: 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c  ema.]cache_spill
6200: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
6210: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
6220: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
6230: 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f  local setting fo
6240: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
6250: 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  cache spill size
6260: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
6270: 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20 73 70  m turns cache sp
6280: 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72 20 6f  ill on.  ** or o
6290: 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e 6e 69  ff.  When turnni
62a0: 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f  ng cache spill o
62b0: 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73 20 73  n, the size is s
62c0: 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63  et to the.  ** c
62d0: 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73 69 7a  urrent cache_siz
62e0: 65 2e 20 20 54 68 65 20 74 68 69 72 64 20 66 6f  e.  The third fo
62f0: 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c 6c 20  rm sets a spill 
6300: 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a 20 6d  size that.  ** m
6310: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
6320: 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65 20 73  form the cache s
6330: 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e 20 69  ize..  ** If N i
6340: 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20  s positive then 
6350: 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a  that is the.  **
6360: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6370: 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20   in the cache.  
6380: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
6390: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
63a0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
63b0: 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74  is adjusted so t
63c0: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75 73  hat the cache us
63d0: 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a  es -N kibibytes.
63e0: 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a    ** of memory..
63f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
6400: 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
6410: 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69 73 20  _spill pages is 
6420: 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20 6e 75  less then the nu
6430: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
6440: 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c 20 6e  he_size pages, n
6450: 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63 75 72  o spilling occur
6460: 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  s until the page
6470: 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73 0a 20   count exceeds. 
6480: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
6490: 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61 67  f cache_size pag
64a0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
64b0: 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f  e cache_spill=BO
64c0: 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20 61 70  OLEAN setting ap
64d0: 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61 74 74  plies to all att
64e0: 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c 0a 20  ached schemas,. 
64f0: 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74 68 65   ** not just the
6500: 20 73 63 68 65 6d 61 20 73 70 65 63 69 66 69 65   schema specifie
6510: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  d..  */.  case P
6520: 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 50 49  ragTyp_CACHE_SPI
6530: 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  LL: {.    assert
6540: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6550: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6560: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6570: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6580: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6590: 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28 64 62  (v,.         (db
65a0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
65b0: 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d 30 20  _CacheSpill)==0 
65c0: 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ? 0 : .         
65d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
65e0: 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d  etSpillSize(pDb-
65f0: 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20 7d 65  >pBt,0));.    }e
6600: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  lse{.      int s
6610: 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ize = 1;.      i
6620: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
6630: 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69 7a 65  32(zRight, &size
6640: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
6650: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6660: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  lSize(pDb->pBt, 
6670: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  size);.      }. 
6680: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6690: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
66a0: 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b 0a 20  t, size!=0) ){. 
66b0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
66c0: 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63 68 65   |= SQLITE_Cache
66d0: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c  Spill;.      }el
66e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
66f0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
6700: 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20  _CacheSpill;.   
6710: 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c     }.      setAl
6720: 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b  lPagerFlags(db);
6730: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6750: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
6760: 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20  .]mmap_size(N). 
6770: 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f   **.  ** Used to
6780: 20 73 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a   set mapping siz
6790: 65 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70  e limit. The map
67a0: 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20  ping size limit 
67b0: 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  is.  ** used to 
67c0: 6c 69 6d 69 74 20 74 68 65 20 61 67 67 72 65 67  limit the aggreg
67d0: 61 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  ate size of all 
67e0: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65  memory mapped re
67f0: 67 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a  gions of the.  *
6800: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
6810: 20 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74   If this paramet
6820: 65 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  er is set to zer
6830: 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  o, then memory m
6840: 61 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e  apping.  ** is n
6850: 6f 74 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20  ot used at all. 
6860: 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76   If N is negativ
6870: 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61  e, then the defa
6880: 75 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20  ult memory map. 
6890: 20 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d   ** limit determ
68a0: 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ined by sqlite3_
68b0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
68c0: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20  NFIG_MMAP_SIZE) 
68d0: 69 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65  is set..  ** The
68e0: 20 70 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20   parameter N is 
68f0: 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65  measured in byte
6900: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
6910: 73 20 76 61 6c 75 65 20 69 73 20 61 64 76 69 73  s value is advis
6920: 6f 72 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c  ory.  The underl
6930: 79 69 6e 67 20 56 46 53 20 69 73 20 66 72 65 65  ying VFS is free
6940: 20 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20   to memory map. 
6950: 20 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72   ** as little or
6960: 20 61 73 20 6d 75 63 68 20 61 73 20 69 74 20 77   as much as it w
6970: 61 6e 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69  ants.  Except, i
6980: 66 20 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20  f N is set to 0 
6990: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70  then the.  ** up
69a0: 70 65 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20  per layers will 
69b0: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65  never invoke the
69c0: 20 78 46 65 74 63 68 20 69 6e 74 65 72 66 61 63   xFetch interfac
69d0: 65 73 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20  es to the VFS.. 
69e0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
69f0: 79 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  yp_MMAP_SIZE: {.
6a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
6a10: 34 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45  4 sz;.#if SQLITE
6a20: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
6a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
6a40: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
6a50: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
6a60: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
6a70: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
6a80: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
6a90: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
6aa0: 69 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20  ight, &sz);.    
6ab0: 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20    if( sz<0 ) sz 
6ac0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
6ad0: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
6ae0: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
6af0: 3d 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  =0 ) db->szMmap 
6b00: 3d 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28  = sz;.      for(
6b10: 69 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69  ii=db->nDb-1; ii
6b20: 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20  >=0; ii--){.    
6b30: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
6b40: 69 69 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d  ii].pBt && (ii==
6b50: 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d  iDb || pId2->n==
6b60: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
6b70: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
6b80: 6d 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62  mapLimit(db->aDb
6b90: 5b 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20  [ii].pBt, sz);. 
6ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20  .    }.    sz = 
6bc0: 2d 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  -1;.    rc = sql
6bd0: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
6be0: 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
6bf0: 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
6c00: 45 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20  E, &sz);.#else. 
6c10: 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72     sz = 0;.    r
6c20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
6c30: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
6c40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6c50: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
6c60: 65 49 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20  eInt(v, sz);.   
6c70: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
6c80: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
6c90: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
6ca0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50  nErr++;.      pP
6cb0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
6cc0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
6cd0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
6ce0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
6cf0: 72 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  re.  **   PRAGMA
6d00: 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64   temp_store = "d
6d10: 65 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22  efault"|"memory"
6d20: 7c 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a  |"file".  **.  *
6d30: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
6d40: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
6d50: 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72  of the temp_stor
6d60: 65 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  e flag.  Changin
6d70: 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  g.  ** the local
6d80: 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
6d90: 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  make changes to 
6da0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e  the disk file an
6db0: 64 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  d the default.  
6dc0: 2a 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ** value will be
6dd0: 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65   restored the ne
6de0: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
6df0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a  base is opened..
6e00: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
6e10: 68 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62  hat it is possib
6e20: 6c 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61  le for the libra
6e30: 72 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ry compile-time 
6e40: 6f 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20  options to.  ** 
6e50: 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 73 65  override this se
6e60: 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73  tting.  */.  cas
6e70: 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53  e PragTyp_TEMP_S
6e80: 54 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  TORE: {.    if( 
6e90: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6ea0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6eb0: 28 76 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  (v, db->temp_sto
6ec0: 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  re);.    }else{.
6ed0: 20 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70        changeTemp
6ee0: 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20  Storage(pParse, 
6ef0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  zRight);.    }. 
6f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f10: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f20: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
6f30: 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52  ectory.  **   PR
6f40: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
6f50: 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22  directory = ""|"
6f60: 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a  directory_name".
6f70: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
6f80: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
6f90: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  l value of the t
6fa0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
6fb0: 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ory flag.  Chang
6fc0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ing.  ** the val
6fd0: 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66  ue sets a specif
6fe0: 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ic directory to 
6ff0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  be used for temp
7000: 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a  orary files..  *
7010: 2a 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e  * Setting to a n
7020: 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72  ull string rever
7030: 74 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  ts to the defaul
7040: 74 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  t temporary dire
7050: 63 74 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20  ctory search..  
7060: 2a 2a 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20  ** If temporary 
7070: 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61  directory is cha
7080: 6e 67 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c  nged, then inval
7090: 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65  idateTempStorage
70a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
70b0: 73 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f  se PragTyp_TEMP_
70c0: 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a  STORE_DIRECTORY:
70d0: 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67   {.    if( !zRig
70e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ht ){.      retu
70f0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7100: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
7110: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c  ectory);.    }el
7120: 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se{.#ifndef SQLI
7130: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
7140: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7150: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
7160: 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
7170: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
7180: 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68  (db->pVfs, zRigh
7190: 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  t, SQLITE_ACCESS
71a0: 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73  _READWRITE, &res
71b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
71c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
71d0: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
71e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
71f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
7200: 20 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65   a writable dire
7210: 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20  ctory");.       
7220: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
7230: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
7240: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7250: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7260: 45 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  E==0.       || (
7270: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7280: 45 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==1 && db->temp
7290: 5f 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20  _store<=1).     
72a0: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
72b0: 50 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62  P_STORE==2 && db
72c0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29  ->temp_store==1)
72d0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
72e0: 20 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70    invalidateTemp
72f0: 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b  Storage(pParse);
7300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7310: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69  qlite3_free(sqli
7320: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
7330: 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ry);.      if( z
7340: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7350: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70      sqlite3_temp
7360: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c  _directory = sql
7370: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
7380: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
7390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
73a0: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
73b0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  rectory = 0;.   
73c0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
73d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a  QLITE_OMIT_WSD *
73e0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  /.    }.    brea
73f0: 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  k;.  }..#if SQLI
7400: 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20  TE_OS_WIN.  /*. 
7410: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74   **   PRAGMA dat
7420: 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
7430: 79 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  y.  **   PRAGMA 
7440: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
7450: 74 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63  tory = ""|"direc
7460: 74 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a  tory_name".  **.
7470: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
7480: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
7490: 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73  ue of the data_s
74a0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66  tore_directory f
74b0: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
74c0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65   ** the value se
74d0: 74 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69  ts a specific di
74e0: 72 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73  rectory to be us
74f0: 65 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ed for database 
7500: 66 69 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  files that.  ** 
7510: 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 77  were specified w
7520: 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
7530: 61 74 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e  athname.  Settin
7540: 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69  g to a null stri
7550: 6e 67 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20  ng reverts.  ** 
7560: 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  to the default d
7570: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
7580: 79 2c 20 77 68 69 63 68 20 66 6f 72 20 64 61 74  y, which for dat
7590: 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63  abase files spec
75a0: 69 66 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  ified with.  ** 
75b0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
75c0: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65  will probably be
75d0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
75e0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  rrent directory 
75f0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f  for the.  ** pro
7600: 63 65 73 73 2e 20 20 44 61 74 61 62 61 73 65 20  cess.  Database 
7610: 66 69 6c 65 20 73 70 65 63 69 66 69 65 64 20 77  file specified w
7620: 69 74 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20  ith an absolute 
7630: 70 61 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70  path are not imp
7640: 61 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  acted.  ** by th
7650: 69 73 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61  is setting, rega
7660: 72 64 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61  rdless of its va
7670: 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  lue..  **.  */. 
7680: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41   case PragTyp_DA
7690: 54 41 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f  TA_STORE_DIRECTO
76a0: 52 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  RY: {.    if( !z
76b0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
76c0: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
76d0: 76 2c 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  v, sqlite3_data_
76e0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
76f0: 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53  }else{.#ifndef S
7700: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
7710: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7720: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  0] ){.        in
7730: 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
7740: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
7750: 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52  ess(db->pVfs, zR
7760: 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43  ight, SQLITE_ACC
7770: 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26  ESS_READWRITE, &
7780: 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
7790: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
77a0: 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  || res==0 ){.   
77b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
77c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
77d0: 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64  not a writable d
77e0: 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20  irectory");.    
77f0: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
7800: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  a_out;.        }
7810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7820: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69  qlite3_free(sqli
7830: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
7840: 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ry);.      if( z
7850: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7860: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
7870: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c  _directory = sql
7880: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
7890: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
78a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
78b0: 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
78c0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  rectory = 0;.   
78d0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
78e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a  QLITE_OMIT_WSD *
78f0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  /.    }.    brea
7900: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
7910: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
7920: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
7930: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
7940: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f  A [schema.]lock_
7950: 70 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20  proxy_file.  ** 
7960: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7970: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7980: 65 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f  e = ":auto:"|"lo
7990: 63 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20  ck_file_path".  
79a0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
79b0: 72 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  r set the value 
79c0: 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78  of the lock_prox
79d0: 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68  y_file flag.  Ch
79e0: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
79f0: 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65  value sets a spe
7a00: 63 69 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65  cific file to be
7a10: 20 75 73 65 64 20 66 6f 72 20 64 61 74 61 62 61   used for databa
7a20: 73 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e  se access locks.
7a30: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
7a40: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50  e PragTyp_LOCK_P
7a50: 52 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20  ROXY_FILE: {.   
7a60: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7a70: 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
7a80: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
7a90: 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74  eePager(pDb->pBt
7aa0: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
7ab0: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d  roxy_file_path =
7ac0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c   NULL;.      sql
7ad0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
7ae0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
7af0: 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
7b00: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
7b10: 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
7b20: 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
7b30: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f           &proxy_
7b60: 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20  file_path);.    
7b70: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
7b80: 78 74 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65  xt(v, proxy_file
7b90: 5f 70 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73  _path);.    }els
7ba0: 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  e{.      Pager *
7bb0: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
7bc0: 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e  BtreePager(pDb->
7bd0: 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pBt);.      sqli
7be0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
7bf0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
7c00: 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
7c10: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7c20: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7c30: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71  {.        res=sq
7c40: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
7c50: 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  ol(pFile, SQLITE
7c60: 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
7c70: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 20 20 20 20 7a 52 69 67 68 74            zRight
7ca0: 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
7cb0: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71  {.        res=sq
7cc0: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
7cd0: 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  ol(pFile, SQLITE
7ce0: 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
7cf0: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b            NULL);
7d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7d30: 66 28 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f  f( res!=SQLITE_O
7d40: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
7d50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7d60: 72 73 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  rse, "failed to 
7d70: 73 65 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  set lock proxy f
7d80: 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67  ile");.        g
7d90: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
7da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7db0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
7dc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
7dd0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
7de0: 4c 45 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20  LE */      .    
7df0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
7e00: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e  GMA [schema.]syn
7e10: 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20  chronous.  **   
7e20: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
7e30: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c  synchronous=OFF|
7e40: 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45  ON|NORMAL|FULL|E
7e50: 58 54 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  XTRA.  **.  ** R
7e60: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7e70: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
7e80: 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  the synchronous 
7e90: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7ea0: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76    ** the local v
7eb0: 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  alue does not ma
7ec0: 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ke changes to th
7ed0: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20  e disk file and 
7ee0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
7ef0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
7f00: 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74  estored the next
7f10: 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
7f20: 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65  se is.  ** opene
7f30: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  d..  */.  case P
7f40: 72 61 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f  ragTyp_SYNCHRONO
7f50: 55 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  US: {.    if( !z
7f60: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
7f70: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
7f80: 2c 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65  , pDb->safety_le
7f90: 76 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  vel-1);.    }els
7fa0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62  e{.      if( !db
7fb0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
7fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7fd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 61  .            "Sa
7ff0: 66 65 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e  fety level may n
8000: 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e  ot be changed in
8010: 73 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69  side a transacti
8020: 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  on");.      }els
8030: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
8040: 4c 65 76 65 6c 20 3d 20 28 67 65 74 53 61 66 65  Level = (getSafe
8050: 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74 2c 30  tyLevel(zRight,0
8060: 2c 31 29 2b 31 29 20 26 20 50 41 47 45 52 5f 53  ,1)+1) & PAGER_S
8070: 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b  YNCHRONOUS_MASK;
8080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 65  .        if( iLe
8090: 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76 65 6c 20  vel==0 ) iLevel 
80a0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 62  = 1;.        pDb
80b0: 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ->safety_level =
80c0: 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20   iLevel;.       
80d0: 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 20 3d   pDb->bSyncSet =
80e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74 41   1;.        setA
80f0: 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29  llPagerFlags(db)
8100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
8120: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8130: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
8140: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
8150: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f  QLITE_OMIT_FLAG_
8160: 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65 20 50  PRAGMAS.  case P
8170: 72 61 67 54 79 70 5f 46 4c 41 47 3a 20 7b 0a 20  ragTyp_FLAG: {. 
8180: 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30     if( zRight==0
8190: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 50 72 61   ){.      setPra
81a0: 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e  gmaResultColumnN
81b0: 61 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29  ames(v, pPragma)
81c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
81d0: 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64 62 2d 3e  ngleInt(v, (db->
81e0: 66 6c 61 67 73 20 26 20 70 50 72 61 67 6d 61 2d  flags & pPragma-
81f0: 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a 20 20 20  >iArg)!=0 );.   
8200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
8210: 74 20 6d 61 73 6b 20 3d 20 70 50 72 61 67 6d 61  t mask = pPragma
8220: 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a 20 4d 61  ->iArg;    /* Ma
8230: 73 6b 20 6f 66 20 62 69 74 73 20 74 6f 20 73 65  sk of bits to se
8240: 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a 2f 0a 20  t or clear. */. 
8250: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
8260: 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
8270: 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 69 67 6e        /* Foreign
8280: 20 6b 65 79 20 73 75 70 70 6f 72 74 20 6d 61 79   key support may
8290: 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c 65 64 20   not be enabled 
82a0: 6f 72 20 64 69 73 61 62 6c 65 64 20 77 68 69 6c  or disabled whil
82b0: 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  e not.        **
82c0: 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20   in auto-commit 
82d0: 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mode.  */.      
82e0: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49    mask &= ~(SQLI
82f0: 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 3b  TE_ForeignKeys);
8300: 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
8310: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
8320: 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  ICATION.      if
8330: 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c  ( db->auth.authL
8340: 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55 73 65 72  evel==UAUTH_User
8350: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
8360: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e 6f 6e 2d  o not allow non-
8370: 61 64 6d 69 6e 20 75 73 65 72 73 20 74 6f 20 6d  admin users to m
8380: 6f 64 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  odify the schema
8390: 20 61 72 62 69 74 72 61 72 69 6c 79 20 2a 2f 0a   arbitrarily */.
83a0: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20          mask &= 
83b0: 7e 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  ~(SQLITE_WriteSc
83c0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a 23  hema);.      }.#
83d0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
83e0: 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
83f0: 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29 7b  an(zRight, 0) ){
8400: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
8410: 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  gs |= mask;.    
8420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8430: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 6d   db->flags &= ~m
8440: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ask;.        if(
8450: 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45 5f 44 65   mask==SQLITE_De
8460: 66 65 72 46 4b 73 20 29 20 64 62 2d 3e 6e 44 65  ferFKs ) db->nDe
8470: 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
8480: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
8490: 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20 74 68 65    /* Many of the
84a0: 20 66 6c 61 67 2d 70 72 61 67 6d 61 73 20 6d 6f   flag-pragmas mo
84b0: 64 69 66 79 20 74 68 65 20 63 6f 64 65 20 67 65  dify the code ge
84c0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 53  nerated by the S
84d0: 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  QL .      ** com
84e0: 70 69 6c 65 72 20 28 65 67 2e 20 63 6f 75 6e 74  piler (eg. count
84f0: 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f 20 61 64  _changes). So ad
8500: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 6f 20 65  d an opcode to e
8510: 78 70 69 72 65 20 61 6c 6c 0a 20 20 20 20 20 20  xpire all.      
8520: 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 20  ** compiled SQL 
8530: 73 74 61 74 65 6d 65 6e 74 73 20 61 66 74 65 72  statements after
8540: 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 70 72 61   modifying a pra
8550: 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  gma value..     
8560: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8570: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
8580: 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 20  P_Expire);.     
8590: 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67   setAllPagerFlag
85a0: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s(db);.    }.   
85b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
85c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
85d0: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 20 2a  T_FLAG_PRAGMAS *
85e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
85f0: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52  E_OMIT_SCHEMA_PR
8600: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
8610: 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69    PRAGMA table_i
8620: 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a 20 20 2a  nfo(<table>).  *
8630: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20  *.  ** Return a 
8640: 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f 72 20 65  single row for e
8650: 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
8660: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 20 54  e named table. T
8670: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
8680: 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ** the returned 
8690: 64 61 74 61 20 73 65 74 20 61 72 65 3a 0a 20 20  data set are:.  
86a0: 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20 20 20 20  **.  ** cid:    
86b0: 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64 20 28 6e      Column id (n
86c0: 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66  umbered from lef
86d0: 74 20 74 6f 20 72 69 67 68 74 2c 20 73 74 61 72  t to right, star
86e0: 74 69 6e 67 20 61 74 20 30 29 0a 20 20 2a 2a 20  ting at 0).  ** 
86f0: 6e 61 6d 65 3a 20 20 20 20 20 20 20 43 6f 6c 75  name:       Colu
8700: 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 79 70  mn name.  ** typ
8710: 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  e:       Column 
8720: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8730: 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20  ..  ** notnull: 
8740: 20 20 20 54 72 75 65 20 69 66 20 27 4e 4f 54 20     True if 'NOT 
8750: 4e 55 4c 4c 27 20 69 73 20 70 61 72 74 20 6f 66  NULL' is part of
8760: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
8770: 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f 76 61  ion.  ** dflt_va
8780: 6c 75 65 3a 20 54 68 65 20 64 65 66 61 75 6c 74  lue: The default
8790: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
87a0: 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a 20  olumn, if any.. 
87b0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
87c0: 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69  yp_TABLE_INFO: i
87d0: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
87e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
87f0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
8800: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
8810: 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52  se, LOCATE_NOERR
8820: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
8830: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
8840: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 0a        int i, k;.
8850: 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64 65        int nHidde
8860: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f 6c  n = 0;.      Col
8870: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  umn *pCol;.     
8880: 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
8890: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
88a0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
88b0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
88c0: 20 36 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   6;.      sqlite
88d0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
88e0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
88f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 69 65        sqlite3Vie
8900: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
8910: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
8920: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 43       for(i=0, pC
8930: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
8940: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
8950: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
8960: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
8970: 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29 7b 0a 20  olumn(pCol) ){. 
8980: 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65 6e           nHidden
8990: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
89a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
89b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
89c0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
89d0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
89e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
89f0: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
8a00: 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d 30  }else if( pPk==0
8a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20   ){.          k 
8a20: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
8a30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
8a40: 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d 3e  r(k=1; k<=pTab->
8a50: 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69 43  nCol && pPk->aiC
8a60: 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20 6b  olumn[k-1]!=i; k
8a70: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d 0a  ++){}.        }.
8a80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8a90: 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20 7c  pCol->pDflt==0 |
8aa0: 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f  | pCol->pDflt->o
8ab0: 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20 20  p==TK_SPAN );.  
8ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ad0: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
8ae0: 20 22 69 73 73 69 73 69 22 2c 0a 20 20 20 20 20   "issisi",.     
8af0: 20 20 20 20 20 20 20 20 20 20 69 2d 6e 48 69 64            i-nHid
8b00: 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  den,.           
8b10: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c      pCol->zName,
8b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b30: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
8b40: 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20  e(pCol,""),.    
8b50: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8b60: 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30  >notNull ? 1 : 0
8b70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8b80: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70   pCol->pDflt ? p
8b90: 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54  Col->pDflt->u.zT
8ba0: 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20  oken : 0,.      
8bb0: 20 20 20 20 20 20 20 20 20 6b 29 3b 0a 20 20 20           k);.   
8bc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8bd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8be0: 75 6c 74 52 6f 77 2c 20 31 2c 20 36 29 3b 0a 20  ultRow, 1, 6);. 
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c00: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
8c10: 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53 3a  e PragTyp_STATS:
8c20: 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49   {.    Index *pI
8c30: 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d  dx;.    HashElem
8c40: 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *i;.    pParse-
8c50: 3e 6e 4d 65 6d 20 3d 20 34 3b 0a 20 20 20 20 73  >nMem = 4;.    s
8c60: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
8c70: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
8c80: 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  Db);.    for(i=s
8c90: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8ca0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
8cb0: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
8cc0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
8cd0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
8ce0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
8cf0: 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71  ata(i);.      sq
8d00: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8d10: 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69 22 2c  ad(v, 1, "ssii",
8d20: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
8d30: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
8d40: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
8d50: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
8d60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
8d70: 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 29 3b 0a  b->nRowLogEst);.
8d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8d90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
8da0: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 34 29 3b 0a  sultRow, 1, 4);.
8db0: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
8dc0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
8dd0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
8de0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ext){.        sq
8df0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8e00: 61 64 28 76 2c 20 32 2c 20 22 73 69 69 22 2c 0a  ad(v, 2, "sii",.
8e10: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
8e20: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8e30: 20 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f     pIdx->szIdxRo
8e40: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  w,.           pI
8e50: 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
8e60: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0]);.        sql
8e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8e80: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8e90: 31 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 4);.      }. 
8ea0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
8eb0: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
8ec0: 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69 66  p_INDEX_INFO: if
8ed0: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
8ee0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
8ef0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8f00: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
8f10: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52  FindIndex(db, zR
8f20: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
8f30: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
8f40: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
8f50: 6e 74 20 6d 78 3b 0a 20 20 20 20 20 20 69 66 28  nt mx;.      if(
8f60: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29   pPragma->iArg )
8f70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41  {.        /* PRA
8f80: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20  GMA index_xinfo 
8f90: 28 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 20 77  (newer version w
8fa0: 69 74 68 20 6d 6f 72 65 20 72 6f 77 73 20 61 6e  ith more rows an
8fb0: 64 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20  d columns) */.  
8fc0: 20 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d        mx = pIdx-
8fd0: 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
8fe0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8ff0: 20 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   6;.      }else{
9000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47  .        /* PRAG
9010: 4d 41 20 69 6e 64 65 78 5f 69 6e 66 6f 20 28 6c  MA index_info (l
9020: 65 67 61 63 79 20 76 65 72 73 69 6f 6e 29 20 2a  egacy version) *
9030: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
9040: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
9050: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9060: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 20 20 7d 0a  em = 3;.      }.
9070: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64        pTab = pId
9080: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  x->pTable;.     
9090: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
90a0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
90b0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 61 73 73   iDb);.      ass
90c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ert( pParse->nMe
90d0: 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61  m<=pPragma->nPra
90e0: 67 43 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  gCName );.      
90f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69  for(i=0; i<mx; i
9100: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  ++){.        i16
9110: 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69   cnum = pIdx->ai
9120: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
9130: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9140: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
9150: 69 73 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a 20 20  is", i, cnum,.  
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 20 20 20 20 20 20 20 20 63 6e 75 6d 3c             cnum<
9180: 30 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 61 43  0 ? 0 : pTab->aC
9190: 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b  ol[cnum].zName);
91a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
91b0: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
91c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
91d0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
91e0: 34 2c 20 22 69 73 69 22 2c 0a 20 20 20 20 20 20  4, "isi",.      
91f0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 6f 72        pIdx->aSor
9200: 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20 20 20 20  tOrder[i],.     
9210: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
9220: 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  oll[i],.        
9230: 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79      i<pIdx->nKey
9240: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Col);.        }.
9250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9260: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9270: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 70 50  ResultRow, 1, pP
9280: 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  arse->nMem);.   
9290: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
92a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20   break;..  case 
92b0: 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 4c 49  PragTyp_INDEX_LI
92c0: 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  ST: if( zRight )
92d0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
92e0: 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
92f0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ab;.    int i;. 
9300: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
9310: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
9320: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
9330: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
9340: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9350: 3d 20 35 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 5;.      sqlit
9360: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9370: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
9380: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9390: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d  pTab->pIndex, i=
93a0: 30 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  0; pIdx; pIdx=pI
93b0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
93c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
93d0: 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20  har *azOrigin[] 
93e0: 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22 70  = { "c", "u", "p
93f0: 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 71  k" };.        sq
9400: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9410: 61 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69 22  ad(v, 1, "isisi"
9420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a  ,.           i,.
9430: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9440: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
9450: 20 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78     IsUniqueIndex
9460: 28 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20  (pIdx),.        
9470: 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78     azOrigin[pIdx
9480: 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20 20  ->idxType],.    
9490: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50 61         pIdx->pPa
94a0: 72 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b 0a  rtIdxWhere!=0);.
94b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
94c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
94d0: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29  ResultRow, 1, 5)
94e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
94f0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
9500: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41 54  case PragTyp_DAT
9510: 41 42 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20 20  ABASE_LIST: {.  
9520: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61    int i;.    pPa
9530: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20  rse->nMem = 3;. 
9540: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
9550: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
9560: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
9570: 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69  ].pBt==0 ) conti
9580: 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
9590: 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  t( db->aDb[i].zD
95a0: 62 53 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  bSName!=0 );.   
95b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
95c0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
95d0: 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 69 2c  ss",.         i,
95e0: 0a 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  .         db->aD
95f0: 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a 20  b[i].zDbSName,. 
9600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
9610: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
9620: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29  db->aDb[i].pBt))
9630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9640: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9650: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29  ResultRow, 1, 3)
9660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
9670: 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61  eak;..  case Pra
9680: 67 54 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c  gTyp_COLLATION_L
9690: 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IST: {.    int i
96a0: 20 3d 20 30 3b 0a 20 20 20 20 48 61 73 68 45 6c   = 0;.    HashEl
96b0: 65 6d 20 2a 70 3b 0a 20 20 20 20 70 50 61 72 73  em *p;.    pPars
96c0: 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20  e->nMem = 2;.   
96d0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
96e0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
96f0: 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69  lSeq); p; p=sqli
9700: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
9710: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9720: 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20  Coll = (CollSeq 
9730: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
9740: 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (p);.      sqlit
9750: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9760: 76 2c 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b 2c  v, 1, "is", i++,
9770: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
9780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9790: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
97a0: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b 0a  sultRow, 1, 2);.
97b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
97c0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
97d0: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
97e0: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
97f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9800: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61  FOREIGN_KEY.  ca
9810: 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49  se PragTyp_FOREI
9820: 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28  GN_KEY_LIST: if(
9830: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 46   zRight ){.    F
9840: 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61  Key *pFK;.    Ta
9850: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
9860: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
9870: 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
9880: 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  t, zDb);.    if(
9890: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
98a0: 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  FK = pTab->pFKey
98b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20  ;.      if( pFK 
98c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
98d0: 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20 20 70   = 0; .        p
98e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b  Parse->nMem = 8;
98f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9900: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
9910: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
9920: 20 20 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b         while(pFK
9930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
9940: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   j;.          fo
9950: 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43  r(j=0; j<pFK->nC
9960: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
9970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9980: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9990: 20 22 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20   "iissssss",.   
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
99c0: 20 20 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20        j,.       
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d              pFK-
99e0: 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  >zTo,.          
99f0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
9a00: 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d  Col[pFK->aCol[j]
9a10: 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20  .iFrom].zName,. 
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a    pFK->aCol[j].z
9a40: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
9a50: 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61          actionNa
9a60: 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b  me(pFK->aAction[
9a70: 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41  1]),  /* ON UPDA
9a80: 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  TE */.          
9a90: 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e           actionN
9aa0: 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e  ame(pFK->aAction
9ab0: 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c  [0]),  /* ON DEL
9ac0: 45 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ETE */.         
9ad0: 20 20 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22            "NONE"
9ae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
9af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9b00: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9b10: 2c 20 31 2c 20 38 29 3b 0a 20 20 20 20 20 20 20  , 1, 8);.       
9b20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
9b30: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
9b40: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
9b50: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
9b60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9b70: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
9b80: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
9b90: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
9ba0: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
9bb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
9bc0: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
9bd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
9be0: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
9bf0: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
9c00: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
9c10: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
9c20: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
9c30: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
9c40: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
9c50: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
9c60: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
9c70: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
9c80: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
9c90: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
9ca0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
9cb0: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
9cc0: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
9cd0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9cf0: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
9d00: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
9d10: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9d20: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9d30: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
9d40: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
9d50: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
9d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9d80: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
9d90: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
9da0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
9db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9dc0: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
9dd0: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
9de0: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
9e10: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
9e20: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
9e30: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
9e40: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
9e50: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
9e60: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
9e70: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
9e80: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
9e90: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
9ea0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
9eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9ec0: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
9ed0: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
9ee0: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
9ef0: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
9f00: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
9f10: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
9f20: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
9f30: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
9f40: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
9f50: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
9f60: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
9f70: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
9f80: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
9f90: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
9fa0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
9fb0: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
9fc0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
9fd0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
9fe0: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
9ff0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
a000: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
a010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
a020: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a030: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
a040: 3b 0a 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65  ;.    k = sqlite
a050: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
a060: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a070: 3e 74 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77  >tblHash);.    w
a080: 68 69 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20  hile( k ){.     
a090: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
a0a0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71         pTab = sq
a0b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a0c0: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67  (pParse, 0, zRig
a0d0: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  ht, zDb);.      
a0e0: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    k = 0;.      }
a0f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
a100: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
a110: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
a120: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
a130: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20  teHashNext(k);. 
a140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a150: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62   pTab==0 || pTab
a160: 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e  ->pFKey==0 ) con
a170: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c  tinue;.      sql
a180: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a190: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
a1a0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
a1b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
a1c0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67  ( pTab->nCol+reg
a1d0: 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  Row>pParse->nMem
a1e0: 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   ) pParse->nMem 
a1f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72  = pTab->nCol + r
a200: 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  egRow;.      sql
a210: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
a220: 61 72 73 65 2c 20 30 2c 20 69 44 62 2c 20 70 54  arse, 0, iDb, pT
a230: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
a240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a250: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
a260: 20 72 65 67 52 65 73 75 6c 74 2c 20 70 54 61 62   regResult, pTab
a270: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a280: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
a290: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
a2a0: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
a2b0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
a2c0: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
a2d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a2e0: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
a2f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a300: 65 6e 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ent==0 ) continu
a310: 65 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  e;.        pIdx 
a320: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
a330: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a340: 61 72 73 65 2c 20 69 44 62 2c 20 70 50 61 72 65  arse, iDb, pPare
a350: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
a360: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
a370: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
a380: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
a390: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
a3a0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
a3b0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
a3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a3d0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
a3e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a3f0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
a400: 2c 20 69 2c 20 69 44 62 2c 20 70 50 61 72 65 6e  , i, iDb, pParen
a410: 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  t, OP_OpenRead);
a420: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a430: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
a440: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a450: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
a460: 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  i, pIdx->tnum, i
a470: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Db);.           
a480: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
a490: 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
a4a0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
a4b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
a4c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  e{.          k =
a4d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
a4e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
a500: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
a510: 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b  r>0 || pFK==0 );
a520: 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20 29  .      if( pFK )
a530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
a540: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69  ( pParse->nTab<i
a550: 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20   ) pParse->nTab 
a560: 3d 20 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = i;.      addrT
a570: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
a580: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
a590: 69 6e 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ind, 0); VdbeCov
a5a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a5b0: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
a5c0: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
a5d0: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
a5e0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
a5f0: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
a600: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a610: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
a620: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
a630: 3b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73  ;.        aiCols
a640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
a650: 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
a660: 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74         x = sqlit
a670: 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28  e3FkLocateIndex(
a680: 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c  pParse, pParent,
a690: 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69   pFK, &pIdx, &ai
a6a0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20  Cols);.         
a6b0: 20 61 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b   assert( x==0 );
a6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6d0: 20 20 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69     addrOk = sqli
a6e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a6f0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (v);.        if(
a700: 20 70 50 61 72 65 6e 74 20 26 26 20 70 49 64 78   pParent && pIdx
a710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a720: 20 69 6e 74 20 69 4b 65 79 20 3d 20 70 46 4b 2d   int iKey = pFK-
a730: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 3b 0a  >aCol[0].iFrom;.
a740: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a750: 28 20 69 4b 65 79 3e 3d 30 20 26 26 20 69 4b 65  ( iKey>=0 && iKe
a760: 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  y<pTab->nCol );.
a770: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4b            if( iK
a780: 65 79 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ey!=pTab->iPKey 
a790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
a7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a7b0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30  (v, OP_Column, 0
a7c0: 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f 77 29 3b  , iKey, regRow);
a7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a7e0: 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
a7f0: 74 28 76 2c 20 70 54 61 62 2c 20 69 4b 65 79 2c  t(v, pTab, iKey,
a800: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20   regRow);.      
a810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a820: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
a830: 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2c 20 61 64  Null, regRow, ad
a840: 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  drOk); VdbeCover
a850: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
a860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a870: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a880: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
a890: 69 64 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b 0a  id, 0, regRow);.
a8a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a8c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
a8d0: 65 6b 52 6f 77 69 64 2c 20 69 2c 20 30 2c 20 72  ekRowid, i, 0, r
a8e0: 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65  egRow); VdbeCove
a8f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
a900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a910: 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  to(v, addrOk);. 
a920: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a930: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a940: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a950: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
a960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a970: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
a980: 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  j<pFK->nCol; j++
a990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
a9a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
a9b0: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
a9c0: 2c 20 70 54 61 62 2c 20 30 2c 0a 20 20 20 20 20  , pTab, 0,.     
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3f 20         aiCols ? 
a9f0: 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d  aiCols[j] : pFK-
aa00: 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 2c 20  >aCol[j].iFrom, 
aa10: 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20  regRow+j);.     
aa20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aa30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
aa40: 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c  sNull, regRow+j,
aa50: 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f   addrOk); VdbeCo
aa60: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
aa70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
aa80: 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
aaa0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
aab0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
aac0: 72 65 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43 6f  regRow, pFK->nCo
aad0: 6c 2c 20 72 65 67 4b 65 79 2c 0a 20 20 20 20 20  l, regKey,.     
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ab00: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
ab10: 28 64 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d 3e  (db,pIdx), pFK->
ab20: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  nCol);.         
ab30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ab40: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
ab50: 75 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20  und, i, addrOk, 
ab60: 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  regKey, 0);.    
ab70: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
ab80: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
ab90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
aba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
abb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
abc0: 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 65 73 75  owid, 0, regResu
abd0: 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  lt+1);.        s
abe0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
abf0: 6f 61 64 28 76 2c 20 72 65 67 52 65 73 75 6c 74  oad(v, regResult
ac00: 2b 32 2c 20 22 73 69 22 2c 20 70 46 4b 2d 3e 7a  +2, "si", pFK->z
ac10: 54 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20  To, i-1);.      
ac20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac30: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
ac40: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
ac50: 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  4);.        sqli
ac60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ac70: 62 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a  bel(v, addrOk);.
ac80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
ac90: 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73  bFree(db, aiCols
aca0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
acb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
acc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30  p2(v, OP_Next, 0
acd0: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
ace0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
acf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ad00: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
ad10: 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Top);.    }.  }.
ad20: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
ad30: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
ad40: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
ad50: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   */.#endif /* !d
ad60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ad70: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
ad80: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  */..#ifndef NDEB
ad90: 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  UG.  case PragTy
ada0: 70 5f 50 41 52 53 45 52 5f 54 52 41 43 45 3a 20  p_PARSER_TRACE: 
adb0: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
adc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
add0: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
ade0: 7a 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20  zRight, 0) ){.  
adf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 72        sqlite3Par
ae00: 73 65 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c  serTrace(stdout,
ae10: 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20   "parser: ");.  
ae20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae30: 20 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72     sqlite3Parser
ae40: 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20  Trace(0, 0);.   
ae50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ae60: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
ae70: 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c 20 74    /* Reinstall t
ae80: 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  he LIKE and GLOB
ae90: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
aea0: 20 76 61 72 69 61 6e 74 20 6f 66 20 4c 49 4b 45   variant of LIKE
aeb0: 0a 20 20 2a 2a 20 75 73 65 64 20 77 69 6c 6c 20  .  ** used will 
aec0: 62 65 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  be case sensitiv
aed0: 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69  e or not dependi
aee0: 6e 67 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 20  ng on the RHS.. 
aef0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
af00: 79 70 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56  yp_CASE_SENSITIV
af10: 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20 69 66  E_LIKE: {.    if
af20: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
af30: 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
af40: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64  rLikeFunctions(d
af50: 62 2c 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  b, sqlite3GetBoo
af60: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 29  lean(zRight, 0))
af70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
af80: 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  eak;..#ifndef SQ
af90: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
afa0: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 0a 23  HECK_ERROR_MAX.#
afb0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49   define SQLITE_I
afc0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
afd0: 52 52 4f 52 5f 4d 41 58 20 31 30 30 0a 23 65 6e  RROR_MAX 100.#en
afe0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
aff0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
b000: 54 59 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 50 72  TY_CHECK.  /* Pr
b010: 61 67 6d 61 20 22 71 75 69 63 6b 5f 63 68 65 63  agma "quick_chec
b020: 6b 22 20 69 73 20 72 65 64 75 63 65 64 20 76 65  k" is reduced ve
b030: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69  rsion of .  ** i
b040: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64  ntegrity_check d
b050: 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63  esigned to detec
b060: 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20  t most database 
b070: 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20  corruption.  ** 
b080: 77 69 74 68 6f 75 74 20 6d 6f 73 74 20 6f 66 20  without most of 
b090: 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
b0a0: 61 20 66 75 6c 6c 20 69 6e 74 65 67 72 69 74 79  a full integrity
b0b0: 2d 63 68 65 63 6b 2e 0a 20 20 2a 2f 0a 20 20 63  -check..  */.  c
b0c0: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54 45  ase PragTyp_INTE
b0d0: 47 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20  GRITY_CHECK: {. 
b0e0: 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64     int i, j, add
b0f0: 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69  r, mxErr;..    i
b100: 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71  nt isQuick = (sq
b110: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65  lite3Tolower(zLe
b120: 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20  ft[0])=='q');.. 
b130: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41     /* If the PRA
b140: 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  GMA command was 
b150: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41  of the form "PRA
b160: 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69  GMA <db>.integri
b170: 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a  ty_check",.    *
b180: 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20 73 65  * then iDb is se
b190: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
b1a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
b1b0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62  dentified by <db
b1c0: 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  >..    ** In thi
b1d0: 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65  s case, the inte
b1e0: 67 72 69 74 79 20 6f 66 20 64 61 74 61 62 61 73  grity of databas
b1f0: 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65  e iDb only is ve
b200: 72 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  rified by.    **
b210: 20 74 68 65 20 56 44 42 45 20 63 72 65 61 74 65   the VDBE create
b220: 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  d below..    **.
b230: 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
b240: 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , if the command
b250: 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41   was simply "PRA
b260: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
b270: 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20  eck" (or.    ** 
b280: 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68  "PRAGMA quick_ch
b290: 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20  eck"), then iDb 
b2a0: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20  is set to 0. In 
b2b0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 69  this case, set i
b2c0: 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20  Db.    ** to -1 
b2d0: 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74  here, to indicat
b2e0: 65 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  e that the VDBE 
b2f0: 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68  should verify th
b300: 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20  e integrity.    
b310: 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68  ** of all attach
b320: 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a  ed databases.  *
b330: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  /.    assert( iD
b340: 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  b>=0 );.    asse
b350: 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49  rt( iDb==0 || pI
b360: 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28  d2->z );.    if(
b370: 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44   pId2->z==0 ) iD
b380: 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20  b = -1;..    /* 
b390: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56  Initialize the V
b3a0: 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  DBE program */. 
b3b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
b3c0: 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 6;..    /* Set
b3d0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72 72   the maximum err
b3e0: 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  or count */.    
b3f0: 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49  mxErr = SQLITE_I
b400: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
b410: 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66  RROR_MAX;.    if
b420: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
b430: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
b440: 32 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72 72  2(zRight, &mxErr
b450: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 45  );.      if( mxE
b460: 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr<=0 ){.       
b470: 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f   mxErr = SQLITE_
b480: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
b490: 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20  ERROR_MAX;.     
b4a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
b4b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b4c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78  , OP_Integer, mx
b4d0: 45 72 72 2c 20 31 29 3b 20 20 2f 2a 20 72 65 67  Err, 1);  /* reg
b4e0: 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73  [1] holds errors
b4f0: 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a   left */..    /*
b500: 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79   Do an integrity
b510: 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64   check on each d
b520: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
b530: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
b540: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
b550: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b      HashElem *x;
b560: 0a 20 20 20 20 20 20 48 61 73 68 20 2a 70 54 62  .      Hash *pTb
b570: 6c 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  ls;.      int *a
b580: 52 6f 6f 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Root;.      int 
b590: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  cnt = 0;.      i
b5a0: 6e 74 20 6d 78 49 64 78 20 3d 20 30 3b 0a 20 20  nt mxIdx = 0;.  
b5b0: 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a 0a 20      int nIdx;.. 
b5c0: 20 20 20 20 20 69 66 28 20 4f 4d 49 54 5f 54 45       if( OMIT_TE
b5d0: 4d 50 44 42 20 26 26 20 69 3d 3d 31 20 29 20 63  MPDB && i==1 ) c
b5e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
b5f0: 66 28 20 69 44 62 3e 3d 30 20 26 26 20 69 21 3d  f( iDb>=0 && i!=
b600: 69 44 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  iDb ) continue;.
b610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
b620: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
b630: 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 20  Parse, i);.     
b640: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
b650: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b660: 49 66 50 6f 73 2c 20 31 29 3b 20 2f 2a 20 48 61  IfPos, 1); /* Ha
b670: 6c 74 20 69 66 20 6f 75 74 20 6f 66 20 65 72 72  lt if out of err
b680: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 56 64 62  ors */.      Vdb
b690: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b6a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
b6c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b6d0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b6e0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20  re(v, addr);..  
b6f0: 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74      /* Do an int
b700: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 66 20  egrity check of 
b710: 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20 20 20  the B-Tree.     
b720: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 67   **.      ** Beg
b730: 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20 74 68  in by finding th
b740: 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d  e root pages num
b750: 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f  bers.      ** fo
b760: 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  r all tables and
b770: 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20   indices in the 
b780: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
b790: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
b7a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
b7b0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30  texHeld(db, i, 0
b7c0: 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73  ) );.      pTbls
b7d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   = &db->aDb[i].p
b7e0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
b7f0: 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30  .      for(cnt=0
b800: 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69  , x=sqliteHashFi
b810: 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78  rst(pTbls); x; x
b820: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
b830: 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  x)){.        Tab
b840: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
b850: 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20  eHashData(x);.  
b860: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
b870: 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  x;.        if( H
b880: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
b890: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  cnt++;.        f
b8a0: 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d  or(nIdx=0, pIdx=
b8b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
b8c0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
b8d0: 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63  Next, nIdx++){ c
b8e0: 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  nt++; }.        
b8f0: 69 66 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29  if( nIdx>mxIdx )
b900: 20 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20   mxIdx = nIdx;. 
b910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f       }.      aRo
b920: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
b930: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
b940: 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31  zeof(int)*(cnt+1
b950: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52  ));.      if( aR
b960: 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oot==0 ) break;.
b970: 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c        for(cnt=0,
b980: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72   x=sqliteHashFir
b990: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
b9a0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
b9b0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
b9c0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
b9d0: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
b9e0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
b9f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  ;.        if( Ha
ba00: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 61  sRowid(pTab) ) a
ba10: 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 54  Root[cnt++] = pT
ba20: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ab->tnum;.      
ba30: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
ba40: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
ba50: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ba60: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f  {.          aRoo
ba70: 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49 64 78 2d  t[cnt++] = pIdx-
ba80: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d  >tnum;.        }
ba90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
baa0: 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30 3b 0a 0a  Root[cnt] = 0;..
bab0: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
bac0: 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75  re sufficient nu
bad0: 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
bae0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  s have been allo
baf0: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  cated */.      p
bb00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
bb10: 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c  X( pParse->nMem,
bb20: 20 38 2b 6d 78 49 64 78 20 29 3b 0a 0a 20 20 20   8+mxIdx );..   
bb30: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 62 2d 74     /* Do the b-t
bb40: 72 65 65 20 69 6e 74 65 67 72 69 74 79 20 63 68  ree integrity ch
bb50: 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  ecks */.      sq
bb60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
bb70: 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  v, OP_IntegrityC
bb80: 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c 20 28 63  k, 2, cnt, 1, (c
bb90: 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34 5f 49 4e  har*)aRoot,P4_IN
bba0: 54 41 52 52 41 59 29 3b 0a 20 20 20 20 20 20 73  TARRAY);.      s
bbb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
bbc0: 50 35 28 76 2c 20 28 75 38 29 69 29 3b 0a 20 20  P5(v, (u8)i);.  
bbd0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
bbe0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
bbf0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 20 56  OP_IsNull, 2); V
bc00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bc20: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
bc30: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a  ring8, 0, 3, 0,.
bc40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bc50: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a  MPrintf(db, "***
bc60: 20 69 6e 20 64 61 74 61 62 61 73 65 20 25 73 20   in database %s 
bc70: 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b  ***\n", db->aDb[
bc80: 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c 0a 20 20  i].zDbSName),.  
bc90: 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
bca0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
bcb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bcc0: 50 5f 4d 6f 76 65 2c 20 32 2c 20 34 2c 20 31 29  P_Move, 2, 4, 1)
bcd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bce0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bcf0: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 32 29  Concat, 4, 3, 2)
bd00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bd10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bd20: 52 65 73 75 6c 74 52 6f 77 2c 20 32 2c 20 31 29  ResultRow, 2, 1)
bd30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bd40: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
bd50: 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ddr);..      /* 
bd60: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  Make sure all th
bd70: 65 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f  e indices are co
bd80: 6e 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63  nstructed correc
bd90: 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
bda0: 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65      for(x=sqlite
bdb0: 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29  HashFirst(pTbls)
bdc0: 3b 20 78 20 26 26 20 21 69 73 51 75 69 63 6b 3b  ; x && !isQuick;
bdd0: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
bde0: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
bdf0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
be00: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
be10: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
be20: 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20  Idx, *pPk;.     
be30: 20 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72     Index *pPrior
be40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
be50: 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20  t loopTop;.     
be60: 20 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c     int iDataCur,
be70: 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
be80: 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a    int r1 = -1;..
be90: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
bea0: 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f  ->pIndex==0 ) co
beb0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
bec0: 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70  pPk = HasRowid(p
bed0: 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74  Tab) ? 0 : sqlit
bee0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
bef0: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
bf00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
bf10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
bf20: 49 66 50 6f 73 2c 20 31 29 3b 20 20 2f 2a 20 53  IfPos, 1);  /* S
bf30: 74 6f 70 20 69 66 20 6f 75 74 20 6f 66 20 65 72  top if out of er
bf40: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rors */.        
bf50: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bf60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bf70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bf80: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
bf90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bfa0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
bfb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
bfc0: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
bfd0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
bfe0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
bff0: 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50  bleAndIndices(pP
c000: 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f  arse, pTab, OP_O
c010: 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20 20 20  penRead, 0,.    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c040: 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72 2c 20  , 0, &iDataCur, 
c050: 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  &iIdxCur);.     
c060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c070: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c080: 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20  er, 0, 7);.     
c090: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78     for(j=0, pIdx
c0a0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
c0b0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
c0c0: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
c0d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c0e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c0f0: 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b  nteger, 0, 8+j);
c100: 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65   /* index entrie
c110: 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  s counter */.   
c120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
c130: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
c140: 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20 20  Mem>=8+j );.    
c150: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c160: 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67  te3NoTempsInRang
c170: 65 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29 20  e(pParse,1,7+j) 
c180: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c1a0: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61 74 61  OP_Rewind, iData
c1b0: 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Cur, 0); VdbeCov
c1c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
c1d0: 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c 69    loopTop = sqli
c1e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c1f0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20 31   OP_AddImm, 7, 1
c200: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65  );.        /* Ve
c210: 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 4e 4f  rify that all NO
c220: 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 72  T NULL columns r
c230: 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e 55  eally are NOT NU
c240: 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  LL */.        fo
c250: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
c260: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
c270: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
c280: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
c290: 6d 70 32 2c 20 6a 6d 70 33 3b 0a 20 20 20 20 20  mp2, jmp3;.     
c2a0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
c2b0: 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
c2c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
c2d0: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
c2e0: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e  notNull==0 ) con
c2f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
c300: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c310: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
c320: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
c330: 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20  ur, j, 3);.     
c340: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c350: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
c360: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
c370: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
c380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c390: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
c3a0: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
c3b0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
c3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3d0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
c3e0: 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63 72 65  1, -1); /* Decre
c3f0: 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d 69 74  ment error limit
c400: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
c410: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
c420: 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61  ntf(db, "NULL va
c430: 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70  lue in %s.%s", p
c440: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
c470: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
c480: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c490: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c4a0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
c4b0: 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e   0, zErr, P4_DYN
c4c0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
c4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4e0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
c4f0: 6f 77 2c 20 33 2c 20 31 29 3b 0a 20 20 20 20 20  ow, 3, 1);.     
c500: 20 20 20 20 20 6a 6d 70 33 20 3d 20 73 71 6c 69       jmp3 = sqli
c510: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c520: 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20 56   OP_IfPos, 1); V
c530: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c540: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c550: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
c560: 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 20 20 20  P_Halt);.       
c570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c580: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b  mpHere(v, jmp2);
c590: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c5a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c5b0: 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20  , jmp3);.       
c5c0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61   }.        /* Va
c5d0: 6c 69 64 61 74 65 20 69 6e 64 65 78 20 65 6e 74  lidate index ent
c5e0: 72 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  ries for the cur
c5f0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  rent row */.    
c600: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64      for(j=0, pId
c610: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c620: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c630: 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20  >pNext, j++){.  
c640: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32          int jmp2
c650: 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d  , jmp3, jmp4, jm
c660: 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  p5;.          in
c670: 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74  t ckUniq = sqlit
c680: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c690: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  v);.          if
c6a0: 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f  ( pPk==pIdx ) co
c6b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c6c0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
c6d0: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
c6e0: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61  Parse, pIdx, iDa
c6f0: 74 61 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d  taCur, 0, 0, &jm
c700: 70 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p3,.            
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
c730: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  r, r1);.        
c740: 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64 78 3b    pPrior = pIdx;
c750: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c760: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c770: 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20  OP_AddImm, 8+j, 
c780: 31 29 3b 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e  1);  /* incremen
c790: 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f  t entry count */
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65  .          /* Ve
c7b0: 72 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64  rify that an ind
c7c0: 65 78 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ex entry exists 
c7d0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
c7e0: 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20  table row */.   
c7f0: 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71         jmp2 = sq
c800: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
c810: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
c820: 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69  iIdxCur+j, ckUni
c830: 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  q, r1,.         
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
c860: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62  x->nColumn); Vdb
c870: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c890: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c8a0: 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 20  AddImm, 1, -1); 
c8b0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65 72 72  /* Decrement err
c8c0: 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20  or limit */.    
c8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c8e0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33  eLoadString(v, 3
c8f0: 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20 20  , "row ");.     
c900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c910: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
c920: 63 61 74 2c 20 37 2c 20 33 2c 20 33 29 3b 0a 20  cat, 7, 3, 3);. 
c930: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c940: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
c950: 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20 66  , 4, " missing f
c960: 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20 20  rom index ");.  
c970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c980: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c990: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29  Concat, 4, 3, 3)
c9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 35  ;.          jmp5
c9b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f   = sqlite3VdbeLo
c9c0: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70  adString(v, 4, p
c9d0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
c9e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c9f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ca00: 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b  oncat, 4, 3, 3);
ca10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ca20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ca30: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 33 2c  OP_ResultRow, 3,
ca40: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   1);.          j
ca50: 6d 70 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp4 = sqlite3Vdb
ca60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
ca70: 50 6f 73 2c 20 31 29 3b 20 56 64 62 65 43 6f 76  Pos, 1); VdbeCov
ca80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ca90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
caa0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp0(v, OP_Halt
cab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cac0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
cad0: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
cae0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51       /* For UNIQ
caf0: 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69  UE indexes, veri
cb00: 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65  fy that only one
cb10: 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 77 69   entry exists wi
cb20: 74 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  th the.         
cb30: 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e   ** current key.
cb40: 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20 75    The entry is u
cb50: 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e 79  nique if (1) any
cb60: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a   column is NULL.
cb70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
cb80: 28 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74  (2) the next ent
cb90: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65  ry has a differe
cba0: 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  nt key */.      
cbb0: 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65      if( IsUnique
cbc0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20  Index(pIdx) ){. 
cbd0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75             int u
cbe0: 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  niqOk = sqlite3V
cbf0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
cc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
cc10: 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20 20 20   jmp6;.         
cc20: 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20     int kk;.     
cc30: 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30 3b         for(kk=0;
cc40: 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   kk<pIdx->nKeyCo
cc50: 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  l; kk++){.      
cc60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
cc70: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
cc80: 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  n[kk];.         
cc90: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
cca0: 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69  l!=XN_ROWID && i
ccb0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
ccc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ccd0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
cce0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ccf0: 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e  notNull ) contin
cd00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
cd10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd20: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
cd30: 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29  , r1+kk, uniqOk)
cd40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
cd50: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
cd70: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 36 20             jmp6 
cd80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cd90: 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op1(v, OP_Next, 
cda0: 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64 62 65  iIdxCur+j); Vdbe
cdb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
cdc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cdd0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69 71  VdbeGoto(v, uniq
cde0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Ok);.           
cdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ce00: 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20  Here(v, jmp6);. 
ce10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ce20: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
ce30: 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64  v, OP_IdxGT, iId
ce40: 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20  xCur+j, uniqOk, 
ce50: 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43       pIdx->nKeyC
ce80: 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
ce90: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
cea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ceb0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
cec0: 2c 20 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63  , 1, -1); /* Dec
ced0: 72 65 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d  rement error lim
cee0: 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  it */.          
cef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
cf00: 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e  dString(v, 3, "n
cf10: 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72 79 20  on-unique entry 
cf20: 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20  in index ");.   
cf30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cf40: 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35  VdbeGoto(v, jmp5
cf50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
cf60: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cf70: 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b  eLabel(v, uniqOk
cf80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
cf90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cfa0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cfb0: 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp4);.         
cfc0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
cfd0: 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
cfe0: 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20  se, jmp3);.     
cff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
d000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d010: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74 61  , OP_Next, iData
d020: 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56  Cur, loopTop); V
d030: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d050: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c  dbeJumpHere(v, l
d060: 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64  oopTop-1);.#ifnd
d070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
d080: 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
d090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d0a0: 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22 77  dString(v, 2, "w
d0b0: 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69 65  rong # of entrie
d0c0: 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  s in index ");. 
d0d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
d0e0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
d0f0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
d100: 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b  dx->pNext, j++){
d110: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d120: 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69  Pk==pIdx ) conti
d130: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61  nue;.          a
d140: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d150: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d160: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d170: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d180: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
d190: 72 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+2); VdbeCovera
d1a0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
d1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d1c0: 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  p2(v, OP_Halt, 0
d1d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d1e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d1f0: 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
d200: 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20 20  IdxCur+j, 3);.  
d210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d220: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d230: 45 71 2c 20 38 2b 6a 2c 20 61 64 64 72 2b 38 2c  Eq, 8+j, addr+8,
d240: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
d250: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d260: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d270: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f  eP5(v, SQLITE_NO
d280: 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  TNULL);.        
d290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d2a0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
d2b0: 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  , 1, -1);.      
d2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
d2d0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
d2e0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
d2f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d300: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d310: 43 6f 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37 29  Concat, 3, 2, 7)
d320: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d330: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d340: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 37   OP_ResultRow, 7
d350: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
d360: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d370: 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
d380: 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20 20   */.      } .   
d390: 20 7d 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73   }.    {.      s
d3a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
d3b0: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
d3c0: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
d3d0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d3e0: 56 64 62 65 4f 70 4c 69 73 74 20 65 6e 64 43 6f  VdbeOpList endCo
d3f0: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
d400: 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20   { OP_AddImm,   
d410: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
d420: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
d430: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
d440: 20 20 20 20 20 20 20 20 20 31 2c 20 34 2c 20 20           1, 4,  
d450: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
d460: 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  1 */.        { O
d470: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30  P_String8,     0
d480: 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 3,        0}, 
d490: 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20     /* 2 */.     
d4a0: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
d4b0: 77 2c 20 20 20 33 2c 20 31 2c 20 20 20 20 20 20  w,   3, 1,      
d4c0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f    0},    /* 3 */
d4d0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
d4e0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20  VdbeOp *aOp;..  
d4f0: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
d500: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
d510: 2c 20 41 72 72 61 79 53 69 7a 65 28 65 6e 64 43  , ArraySize(endC
d520: 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69  ode), endCode, i
d530: 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Ln);.      if( a
d540: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f  Op ){.        aO
d550: 70 5b 30 5d 2e 70 32 20 3d 20 2d 6d 78 45 72 72  p[0].p2 = -mxErr
d560: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d  ;.        aOp[2]
d570: 2e 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41  .p4type = P4_STA
d580: 54 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  TIC;.        aOp
d590: 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b  [2].p4.z = "ok";
d5a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d5b0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
d5c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d5d0: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
d5e0: 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
d5f0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
d600: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
d610: 4d 41 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a  MA encoding.  **
d620: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
d630: 6e 67 20 3d 20 22 75 74 66 2d 38 22 7c 22 75 74  ng = "utf-8"|"ut
d640: 66 2d 31 36 22 7c 22 75 74 66 2d 31 36 6c 65 22  f-16"|"utf-16le"
d650: 7c 22 75 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a  |"utf-16be".  **
d660: 0a 20 20 2a 2a 20 49 6e 20 69 74 73 20 66 69 72  .  ** In its fir
d670: 73 74 20 66 6f 72 6d 2c 20 74 68 69 73 20 70 72  st form, this pr
d680: 61 67 6d 61 20 72 65 74 75 72 6e 73 20 74 68 65  agma returns the
d690: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
d6a0: 20 6d 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62   main.  ** datab
d6b0: 61 73 65 2e 20 49 66 20 74 68 65 20 64 61 74 61  ase. If the data
d6c0: 62 61 73 65 20 69 73 20 6e 6f 74 20 69 6e 69 74  base is not init
d6d0: 69 61 6c 69 7a 65 64 2c 20 69 74 20 69 73 20 69  ialized, it is i
d6e0: 6e 69 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a  nitialized now..
d6f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
d700: 63 6f 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68 69  cond form of thi
d710: 73 20 70 72 61 67 6d 61 20 69 73 20 61 20 6e 6f  s pragma is a no
d720: 2d 6f 70 20 69 66 20 74 68 65 20 6d 61 69 6e 20  -op if the main 
d730: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
d740: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
d750: 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  dy been initiali
d760: 7a 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  zed. In this cas
d770: 65 20 69 74 20 73 65 74 73 20 74 68 65 20 64 65  e it sets the de
d780: 66 61 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64  fault.  ** encod
d790: 69 6e 67 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ing that will be
d7a0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61   used for the ma
d7b0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
d7c0: 20 69 66 20 61 20 6e 65 77 20 66 69 6c 65 0a 20   if a new file. 
d7d0: 20 2a 2a 20 69 73 20 63 72 65 61 74 65 64 2e 20   ** is created. 
d7e0: 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d  If an existing m
d7f0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
d800: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65  e is opened, the
d810: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  n the.  ** defau
d820: 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  lt text encoding
d830: 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 69 6e   for the existin
d840: 67 20 64 61 74 61 62 61 73 65 20 69 73 20 75 73  g database is us
d850: 65 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  ed..  ** .  ** I
d860: 6e 20 61 6c 6c 20 63 61 73 65 73 20 6e 65 77 20  n all cases new 
d870: 64 61 74 61 62 61 73 65 73 20 63 72 65 61 74 65  databases create
d880: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
d890: 43 48 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20  CH command are. 
d8a0: 20 2a 2a 20 63 72 65 61 74 65 64 20 74 6f 20 75   ** created to u
d8b0: 73 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61  se the same defa
d8c0: 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ult text encodin
d8d0: 67 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61  g as the main da
d8e0: 74 61 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20  tabase. If.  ** 
d8f0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
d900: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 69  e has not been i
d910: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f  nitialized and/o
d920: 72 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 41  r created when A
d930: 54 54 41 43 48 0a 20 20 2a 2a 20 69 73 20 65 78  TTACH.  ** is ex
d940: 65 63 75 74 65 64 2c 20 74 68 69 73 20 69 73 20  ecuted, this is 
d950: 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
d960: 41 54 54 41 43 48 20 6f 70 65 72 61 74 69 6f 6e  ATTACH operation
d970: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74  ..  **.  ** In t
d980: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74  he second form t
d990: 68 69 73 20 70 72 61 67 6d 61 20 73 65 74 73 20  his pragma sets 
d9a0: 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
d9b0: 67 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 0a  g to be used in.
d9c0: 20 20 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73    ** new databas
d9d0: 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
d9e0: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
d9f0: 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 74 20 69  ase handle. It i
da00: 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66  s only.  ** usef
da10: 75 6c 20 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d  ul if invoked im
da20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
da30: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
da40: 65 20 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  e i.  */.  case 
da50: 50 72 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47  PragTyp_ENCODING
da60: 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
da70: 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e  onst struct EncN
da80: 61 6d 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ame {.      char
da90: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75   *zName;.      u
daa0: 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63  8 enc;.    } enc
dab0: 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  names[] = {.    
dac0: 20 20 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20    { "UTF8",     
dad0: 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20  SQLITE_UTF8     
dae0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
daf0: 54 46 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45  TF-8",    SQLITE
db00: 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20  _UTF8        }, 
db10: 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d   /* Must be elem
db20: 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20  ent [1] */.     
db30: 20 7b 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53   { "UTF-16le", S
db40: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20  QLITE_UTF16LE   
db50: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
db60: 20 65 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a   element [2] */.
db70: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62        { "UTF-16b
db80: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
db90: 42 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75  BE     },  /* Mu
dba0: 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33  st be element [3
dbb0: 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  ] */.      { "UT
dbc0: 46 31 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f  F16le",  SQLITE_
dbd0: 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20  UTF16LE     },. 
dbe0: 20 20 20 20 20 7b 20 22 55 54 46 31 36 62 65 22       { "UTF16be"
dbf0: 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ,  SQLITE_UTF16B
dc00: 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  E     },.      {
dc10: 20 22 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20   "UTF-16",   0  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46  }, /* SQLITE_UTF
dc40: 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20  16NATIVE */.    
dc50: 20 20 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20    { "UTF16",    
dc60: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
dc70: 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f     }, /* SQLITE_
dc80: 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20  UTF16NATIVE */. 
dc90: 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
dca0: 20 20 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73    };.    const s
dcb0: 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70  truct EncName *p
dcc0: 45 6e 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Enc;.    if( !zR
dcd0: 69 67 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50  ight ){    /* "P
dce0: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20  RAGMA encoding" 
dcf0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
dd00: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
dd10: 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72  Parse) ) goto pr
dd20: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
dd30: 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73  assert( encnames
dd40: 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e  [SQLITE_UTF8].en
dd50: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c==SQLITE_UTF8 )
dd60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dd70: 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f  encnames[SQLITE_
dd80: 55 54 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51  UTF16LE].enc==SQ
dd90: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a  LITE_UTF16LE );.
dda0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
ddb0: 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54  cnames[SQLITE_UT
ddc0: 46 31 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49  F16BE].enc==SQLI
ddd0: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
dde0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
ddf0: 54 65 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73  Text(v, encnames
de00: 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29  [ENC(pParse->db)
de10: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ].zName);.    }e
de20: 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
de30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
de40: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
de50: 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20 20 20 20  = XXX" */.      
de60: 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74  /* Only change t
de70: 68 65 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  he value of sqli
de80: 74 65 2e 65 6e 63 20 69 66 20 74 68 65 20 64 61  te.enc if the da
de90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69 73  tabase handle is
dea0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e   not.      ** in
deb0: 69 74 69 61 6c 69 7a 65 64 2e 20 49 66 20 74 68  itialized. If th
dec0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
ded0: 65 78 69 73 74 73 2c 20 74 68 65 20 6e 65 77 20  exists, the new 
dee0: 73 71 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75 65  sqlite.enc value
def0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
df00: 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
df10: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  en the schema is
df20: 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e 20 49 66   next loaded. If
df30: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20   it does not.   
df40: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78     ** already ex
df50: 69 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 65  ists, it will be
df60: 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20   created to use 
df70: 74 68 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67  the new encoding
df80: 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f   value..      */
df90: 0a 20 20 20 20 20 20 69 66 28 20 0a 20 20 20 20  .      if( .    
dfa0: 20 20 20 20 21 28 44 62 48 61 73 50 72 6f 70 65      !(DbHasPrope
dfb0: 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53 63  rty(db, 0, DB_Sc
dfc0: 68 65 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20  hemaLoaded)) || 
dfd0: 0a 20 20 20 20 20 20 20 20 44 62 48 61 73 50 72  .        DbHasPr
dfe0: 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42  operty(db, 0, DB
dff0: 5f 45 6d 70 74 79 29 20 0a 20 20 20 20 20 20 29  _Empty) .      )
e000: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 45  {.        for(pE
e010: 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b  nc=&encnames[0];
e020: 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45   pEnc->zName; pE
e030: 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  nc++){.         
e040: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
e050: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 70  trICmp(zRight, p
e060: 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20  Enc->zName) ){. 
e070: 20 20 20 20 20 20 20 20 20 20 20 53 43 48 45 4d             SCHEM
e080: 41 5f 45 4e 43 28 64 62 29 20 3d 20 45 4e 43 28  A_ENC(db) = ENC(
e090: 64 62 29 20 3d 0a 20 20 20 20 20 20 20 20 20 20  db) =.          
e0a0: 20 20 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20        pEnc->enc 
e0b0: 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51  ? pEnc->enc : SQ
e0c0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
e0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
e0e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
e0f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e100: 20 20 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e     if( !pEnc->zN
e110: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
e120: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e130: 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70  (pParse, "unsupp
e140: 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20  orted encoding: 
e150: 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  %s", zRight);.  
e160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
e180: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
e190: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
e1a0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e1b0: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45  E_OMIT_SCHEMA_VE
e1c0: 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  RSION_PRAGMAS.  
e1d0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
e1e0: 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61   [schema.]schema
e1f0: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20  _version.  **   
e200: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
e210: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d  schema_version =
e220: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
e230: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e240: 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73  chema.]user_vers
e250: 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ion.  **   PRAGM
e260: 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f  A [schema.]user_
e270: 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67  version = <integ
e280: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er>.  **.  **   
e290: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
e2a0: 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20  freelist_count. 
e2b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e2c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f  A [schema.]data_
e2d0: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a  version.  **.  *
e2e0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
e2f0: 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f  ma.]application_
e300: 69 64 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  id.  **   PRAGMA
e310: 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63   [schema.]applic
e320: 61 74 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65  ation_id = <inte
e330: 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger>.  **.  ** T
e340: 68 65 20 70 72 61 67 6d 61 27 73 20 73 63 68 65  he pragma's sche
e350: 6d 61 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20 75  ma_version and u
e360: 73 65 72 5f 76 65 72 73 69 6f 6e 20 61 72 65 20  ser_version are 
e370: 75 73 65 64 20 74 6f 20 73 65 74 20 6f 72 20 67  used to set or g
e380: 65 74 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  et.  ** the valu
e390: 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2d  e of the schema-
e3a0: 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72  version and user
e3b0: 2d 76 65 72 73 69 6f 6e 2c 20 72 65 73 70 65 63  -version, respec
e3c0: 74 69 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a  tively. Both.  *
e3d0: 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  * the schema-ver
e3e0: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 75 73 65  sion and the use
e3f0: 72 2d 76 65 72 73 69 6f 6e 20 61 72 65 20 33 32  r-version are 32
e400: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
e410: 67 65 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64  gers.  ** stored
e420: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
e430: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20   header..  **.  
e440: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 2d 63 6f  ** The schema-co
e450: 6f 6b 69 65 20 69 73 20 75 73 75 61 6c 6c 79 20  okie is usually 
e460: 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 64  only manipulated
e470: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53   internally by S
e480: 51 4c 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69  QLite. It.  ** i
e490: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  s incremented by
e4a0: 20 53 51 4c 69 74 65 20 77 68 65 6e 65 76 65 72   SQLite whenever
e4b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
e4c0: 68 65 6d 61 20 69 73 20 6d 6f 64 69 66 69 65 64  hema is modified
e4d0: 20 28 62 79 0a 20 20 2a 2a 20 63 72 65 61 74 69   (by.  ** creati
e4e0: 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e 67 20 61  ng or dropping a
e4f0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 29   table or index)
e500: 2e 20 54 68 65 20 73 63 68 65 6d 61 20 76 65 72  . The schema ver
e510: 73 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 0a  sion is used by.
e520: 20 20 2a 2a 20 53 51 4c 69 74 65 20 65 61 63 68    ** SQLite each
e530: 20 74 69 6d 65 20 61 20 71 75 65 72 79 20 69 73   time a query is
e540: 20 65 78 65 63 75 74 65 64 20 74 6f 20 65 6e 73   executed to ens
e550: 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e 74  ure that the int
e560: 65 72 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a  ernal cache.  **
e570: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 75   of the schema u
e580: 73 65 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69  sed when compili
e590: 6e 67 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  ng the SQL query
e5a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 63 68   matches the sch
e5b0: 65 6d 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ema of.  ** the 
e5c0: 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 73 74  database against
e5d0: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 69   which the compi
e5e0: 6c 65 64 20 71 75 65 72 79 20 69 73 20 61 63 74  led query is act
e5f0: 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 0a  ually executed..
e600: 20 20 2a 2a 20 53 75 62 76 65 72 74 69 6e 67 20    ** Subverting 
e610: 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 62  this mechanism b
e620: 79 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  y using "PRAGMA 
e630: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20  schema_version" 
e640: 74 6f 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  to modify.  ** t
e650: 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f  he schema-versio
e660: 6e 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  n is potentially
e670: 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d   dangerous and m
e680: 61 79 20 6c 65 61 64 20 74 6f 20 70 72 6f 67 72  ay lead to progr
e690: 61 6d 0a 20 20 2a 2a 20 63 72 61 73 68 65 73 20  am.  ** crashes 
e6a0: 6f 72 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  or database corr
e6b0: 75 70 74 69 6f 6e 2e 20 55 73 65 20 77 69 74 68  uption. Use with
e6c0: 20 63 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20   caution!.  **. 
e6d0: 20 2a 2a 20 54 68 65 20 75 73 65 72 2d 76 65 72   ** The user-ver
e6e0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65 64  sion is not used
e6f0: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53   internally by S
e700: 51 4c 69 74 65 2e 20 49 74 20 6d 61 79 20 62 65  QLite. It may be
e710: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 61 70   used by.  ** ap
e720: 70 6c 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 61  plications for a
e730: 6e 79 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f  ny purpose..  */
e740: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
e750: 48 45 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a  HEADER_VALUE: {.
e760: 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20      int iCookie 
e770: 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b  = pPragma->iArg;
e780: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69    /* Which cooki
e790: 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
e7a0: 74 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  te */.    sqlite
e7b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
e7c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
e7d0: 7a 52 69 67 68 74 20 26 26 20 28 70 50 72 61 67  zRight && (pPrag
e7e0: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
e7f0: 72 61 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29  ragFlg_ReadOnly)
e800: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
e810: 57 72 69 74 65 20 74 68 65 20 73 70 65 63 69 66  Write the specif
e820: 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ied cookie value
e830: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
e840: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
e850: 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20  t setCookie[] = 
e860: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54  {.        { OP_T
e870: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30  ransaction,    0
e880: 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  1,  0},    /*
e890: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   0 */.        { 
e8a0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
e8b0: 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20     0,  0,  0},  
e8c0: 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20    /* 1 */.      
e8d0: 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  };.      VdbeOp 
e8e0: 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  *aOp;.      sqli
e8f0: 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d  te3VdbeVerifyNoM
e900: 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c  allocRequired(v,
e910: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f   ArraySize(setCo
e920: 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f  okie));.      aO
e930: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
e940: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
e950: 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29  ySize(setCookie)
e960: 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b  , setCookie, 0);
e970: 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f  .      if( ONLY_
e980: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
e990: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
e9a0: 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  k;.      aOp[0].
e9b0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
e9c0: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
e9d0: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32  .      aOp[1].p2
e9e0: 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20   = iCookie;.    
e9f0: 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71    aOp[1].p3 = sq
ea00: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
ea10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ea20: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
ea30: 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65  specified cookie
ea40: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20   value */.      
ea50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
ea60: 65 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b  eOpList readCook
ea70: 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ie[] = {.       
ea80: 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f   { OP_Transactio
ea90: 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  n,     0,  0,  0
eaa0: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
eab0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
eac0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
ead0: 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20  1,  0},    /* 1 
eae0: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
eaf0: 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20  ResultRow,      
eb00: 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20   1,  1,  0}.    
eb10: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
eb20: 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71  p *aOp;.      sq
eb30: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
eb40: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
eb50: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61  v, ArraySize(rea
eb60: 64 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20  dCookie));.     
eb70: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
eb80: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
eb90: 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f  rraySize(readCoo
eba0: 6b 69 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c  kie),readCookie,
ebb0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e  0);.      if( ON
ebc0: 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54  LY_IF_REALLOC_ST
ebd0: 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62  RESS(aOp==0) ) b
ebe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b  reak;.      aOp[
ebf0: 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  0].p1 = iDb;.   
ec00: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
ec10: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
ec20: 2e 70 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20  .p3 = iCookie;. 
ec30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ec40: 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 20  Reusable(v);.   
ec50: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
ec60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ec70: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52  _OMIT_SCHEMA_VER
ec80: 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  SION_PRAGMAS */.
ec90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eca0: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
ecb0: 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20  ON_DIAGS.  /*.  
ecc0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70  **   PRAGMA comp
ecd0: 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a  ile_options.  **
ece0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
ecf0: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f   names of all co
ed00: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
ed10: 6e 73 20 75 73 65 64 20 69 6e 20 74 68 69 73 20  ns used in this 
ed20: 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20  build,.  ** one 
ed30: 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a  option per row..
ed40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
ed50: 54 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49  Typ_COMPILE_OPTI
ed60: 4f 4e 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ONS: {.    int i
ed70: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
ed80: 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
ed90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31  pParse->nMem = 1
eda0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f  ;.    while( (zO
edb0: 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  pt = sqlite3_com
edc0: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69  pileoption_get(i
edd0: 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ++))!=0 ){.     
ede0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
edf0: 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70  String(v, 1, zOp
ee00: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ee10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee20: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
ee30: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
ee40: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
ee50: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  e(v);.  }.  brea
ee60: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
ee70: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
ee80: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a  OPTION_DIAGS */.
ee90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eea0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20  OMIT_WAL.  /*.  
eeb0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
eec0: 65 6d 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f  ema.]wal_checkpo
eed0: 69 6e 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75  int = passive|fu
eee0: 6c 6c 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63  ll|restart|trunc
eef0: 61 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  ate.  **.  ** Ch
ef00: 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74  eckpoint the dat
ef10: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
ef20: 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43  se PragTyp_WAL_C
ef30: 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
ef40: 20 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32   int iBt = (pId2
ef50: 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d  ->z?iDb:SQLITE_M
ef60: 41 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20  AX_ATTACHED);.  
ef70: 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51    int eMode = SQ
ef80: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
ef90: 50 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28  PASSIVE;.    if(
efa0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
efb0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
efc0: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c  Cmp(zRight, "ful
efd0: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
efe0: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
eff0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
f000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f010: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f020: 28 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61 72  (zRight, "restar
f030: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
f040: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
f050: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
f060: 41 52 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ART;.      }else
f070: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f080: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 74 72 75  Cmp(zRight, "tru
f090: 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ncate")==0 ){.  
f0a0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51        eMode = SQ
f0b0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
f0c0: 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20  TRUNCATE;.      
f0d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
f0e0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20  se->nMem = 3;.  
f0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f100: 4f 70 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  Op3(v, OP_Checkp
f110: 6f 69 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65  oint, iBt, eMode
f120: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
f130: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f140: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
f150: 33 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  3);.  }.  break;
f160: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
f170: 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65  AGMA wal_autoche
f180: 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50  ckpoint.  **   P
f190: 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68  RAGMA wal_autoch
f1a0: 65 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a  eckpoint = N.  *
f1b0: 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65  *.  ** Configure
f1c0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
f1d0: 65 63 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61  ection to automa
f1e0: 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
f1f0: 6e 74 20 61 20 64 61 74 61 62 61 73 65 0a 20 20  nt a database.  
f200: 2a 2a 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c  ** after accumul
f210: 61 74 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69  ating N frames i
f220: 6e 20 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75  n the log. Or qu
f230: 65 72 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  ery for the curr
f240: 65 6e 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  ent value.  ** o
f250: 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  f N..  */.  case
f260: 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54   PragTyp_WAL_AUT
f270: 4f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20  OCHECKPOINT: {. 
f280: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
f290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77  .      sqlite3_w
f2a0: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
f2b0: 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f  t(db, sqlite3Ato
f2c0: 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  i(zRight));.    
f2d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
f2e0: 6c 65 49 6e 74 28 76 2c 20 0a 20 20 20 20 20 20  leInt(v, .      
f2f0: 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
f300: 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c 44 65 66  k==sqlite3WalDef
f310: 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20  aultHook ? .    
f320: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 54         SQLITE_PT
f330: 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61  R_TO_INT(db->pWa
f340: 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a  lArg) : 0);.  }.
f350: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
f360: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
f370: 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79  MA shrink_memory
f380: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
f390: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
f3a0: 32 33 34 34 35 2d 34 36 31 30 39 20 54 68 69 73  23445-46109 This
f3b0: 20 70 72 61 67 6d 61 20 63 61 75 73 65 73 20 74   pragma causes t
f3c0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
f3d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77   connection on w
f3e0: 68 69 63 68 20 69 74 20 69 73 20 69 6e 76 6f 6b  hich it is invok
f3f0: 65 64 20 74 6f 20 66 72 65 65 20 75 70 20 61 73  ed to free up as
f400: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
f410: 69 74 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20  it.  ** can, by 
f420: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
f430: 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
f440: 79 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  y()..  */.  case
f450: 20 50 72 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f   PragTyp_SHRINK_
f460: 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71  MEMORY: {.    sq
f470: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
f480: 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20  _memory(db);.   
f490: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f4a0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f4b0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a  busy_timeout.  *
f4c0: 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
f4d0: 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a  timeout = N.  **
f4e0: 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  ** Call sqlit
f4f0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
f500: 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20  db, N).  Return 
f510: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
f520: 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  out value.  ** i
f530: 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49  f one is set.  I
f540: 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65  f no busy handle
f550: 72 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74  r or a different
f560: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73   busy handler is
f570: 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30   set.  ** then 0
f580: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53   is returned.  S
f590: 65 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f  etting the busy_
f5a0: 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20  timeout to 0 or 
f5b0: 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69  negative.  ** di
f5c0: 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f  sables the timeo
f5d0: 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73  ut..  */.  /*cas
f5e0: 65 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  e PragTyp_BUSY_T
f5f0: 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74  IMEOUT*/ default
f600: 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  : {.    assert( 
f610: 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79  pPragma->ePragTy
f620: 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f  p==PragTyp_BUSY_
f630: 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69  TIMEOUT );.    i
f640: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
f650: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
f660: 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69  timeout(db, sqli
f670: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
f680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
f690: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64  rnSingleInt(v, d
f6a0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b  b->busyTimeout);
f6b0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f6c0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
f6d0: 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
f6e0: 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  mit.  **   PRAGM
f6f0: 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  A soft_heap_limi
f700: 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
f710: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
f720: 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30  F: R-26343-45930
f730: 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76   This pragma inv
f740: 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71  okes the.  ** sq
f750: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
f760: 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66  limit64() interf
f770: 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67  ace with the arg
f780: 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73  ument N, if N is
f790: 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
f7a0: 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  and is a non-neg
f7b0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20  ative integer.. 
f7c0: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
f7d0: 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30  ON-OF: R-64451-0
f7e0: 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65  7163 The soft_he
f7f0: 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20  ap_limit pragma 
f800: 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75  always.  ** retu
f810: 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74  rns the same int
f820: 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20  eger that would 
f830: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f840: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
f850: 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
f860: 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65  4(-1) C-language
f870: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
f880: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
f890: 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20  OFT_HEAP_LIMIT: 
f8a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
f8b0: 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a  t64 N;.    if( z
f8c0: 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33  Right && sqlite3
f8d0: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
f8e0: 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
f8f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
f900: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
f910: 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20  limit64(N);.    
f920: 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
f930: 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
f940: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
f950: 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  64(-1));.    bre
f960: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
f970: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65  **   PRAGMA thre
f980: 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ads.  **   PRAGM
f990: 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20  A threads = N.  
f9a0: 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72  **.  ** Configur
f9b0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
f9c0: 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74  mber of worker t
f9d0: 68 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20  hreads.  Return 
f9e0: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78  the new.  ** max
f9f0: 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68  imum, which migh
fa00: 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72  t be less than r
fa10: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
fa20: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48   case PragTyp_TH
fa30: 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c  READS: {.    sql
fa40: 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20  ite3_int64 N;.  
fa50: 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20    if( zRight.   
fa60: 20 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f    && sqlite3DecO
fa70: 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
fa80: 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
fa90: 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20  .     && N>=0.  
faa0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
fab0: 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
fac0: 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
fad0: 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28  _THREADS, (int)(
fae0: 4e 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a  N&0x7fffffff));.
faf0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
fb00: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c  SingleInt(v, sql
fb10: 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
fb20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
fb30: 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29  ER_THREADS, -1))
fb40: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
fb50: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
fb60: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
fb70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
fb80: 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65  ST).  /*.  ** Re
fb90: 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
fba0: 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c   state of file l
fbb0: 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ogs for all data
fbc0: 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73  bases.  */.  cas
fbd0: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53  e PragTyp_LOCK_S
fbe0: 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61  TATUS: {.    sta
fbf0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
fc00: 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65  const azLockName
fc10: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e  [] = {.      "un
fc20: 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64  locked", "shared
fc30: 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22  ", "reserved", "
fc40: 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75  pending", "exclu
fc50: 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20  sive".    };.   
fc60: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72   int i;.    pPar
fc70: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
fc80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
fc90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
fca0: 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
fcb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fcc0: 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77  zState = "unknow
fcd0: 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  n";.      int j;
fce0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
fcf0: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d  Db[i].zDbSName==
fd00: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
fd10: 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44      pBt = db->aD
fd20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
fd30: 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71  if( pBt==0 || sq
fd40: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
fd50: 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pBt)==0 ){.     
fd60: 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f     zState = "clo
fd70: 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  sed";.      }els
fd80: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69  e if( sqlite3_fi
fd90: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69  le_control(db, i
fda0: 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44   ? db->aDb[i].zD
fdb0: 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20  bSName : 0, .   
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c    SQLITE_FCNTL_L
fdf0: 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53  OCKSTATE, &j)==S
fe00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fe10: 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a       zState = az
fe20: 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20  LockName[j];.   
fe30: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
fe40: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
fe50: 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e  v, 1, "ss", db->
fe60: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c  aDb[i].zDbSName,
fe70: 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   zState);.      
fe80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe90: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
fea0: 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  w, 1, 2);.    }.
feb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
fec0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
fed0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
fee0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b 45   case PragTyp_KE
fef0: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  Y: {.    if( zRi
ff00: 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b 65  ght ) sqlite3_ke
ff10: 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52  y_v2(db, zDb, zR
ff20: 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72  ight, sqlite3Str
ff30: 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a  len30(zRight));.
ff40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
ff50: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 52 45   case PragTyp_RE
ff60: 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  KEY: {.    if( z
ff70: 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f  Right ) sqlite3_
ff80: 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  rekey_v2(db, zDb
ff90: 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65  , zRight, sqlite
ffa0: 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74  3Strlen30(zRight
ffb0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
ffc0: 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79   }.  case PragTy
ffd0: 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20  p_HEXKEY: {.    
ffe0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
fff0: 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
10000 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
10010 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a   char zKey[40];.
10020 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69        for(i=0, i
10030 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  Byte=0; i<sizeof
10040 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69  (zKey)*2 && sqli
10050 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69 67  te3Isxdigit(zRig
10060 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ht[i]); i++){.  
10070 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69        iByte = (i
10080 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74  Byte<<4) + sqlit
10090 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68  e3HexToInt(zRigh
100a0 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t[i]);.        i
100b0 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
100c0 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
100d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
100e0 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20 30  f( (zLeft[3] & 0
100f0 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20 20  xf)==0xb ){.    
10100 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
10110 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79  v2(db, zDb, zKey
10120 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 65  , i/2);.      }e
10130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10140 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62  ite3_rekey_v2(db
10150 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32  , zDb, zKey, i/2
10160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10170 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10180 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
10190 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
101a0 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  DEC) || defined(
101b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45  SQLITE_ENABLE_CE
101c0 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61 67  ROD).  case Prag
101d0 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58 54  Typ_ACTIVATE_EXT
101e0 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52 69  ENSIONS: if( zRi
101f0 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ght ){.#ifdef SQ
10200 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
10210 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
10220 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  rNICmp(zRight, "
10230 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a  see-", 4)==0 ){.
10240 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63        sqlite3_ac
10250 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69 67  tivate_see(&zRig
10260 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ht[4]);.    }.#e
10270 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
10280 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0a  TE_ENABLE_CEROD.
10290 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
102a0 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
102b0 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30 20  "cerod-", 6)==0 
102c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
102d0 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64 28  _activate_cerod(
102e0 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20 20  &zRight[6]);.   
102f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
10300 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
10310 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65   } /* End of the
10320 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20 2a   PRAGMA switch *
10330 2f 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20  /..pragma_out:. 
10340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10350 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c  b, zLeft);.  sql
10360 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10370 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65  Right);.}.#ifnde
10380 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10390 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a  RTUALTABLE./****
103a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70  *********.** Imp
103f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
10400 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  n eponymous virt
10410 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72  ual table that r
10420 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a  uns a pragma..**
10430 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
10440 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 50 72  ct PragmaVtab Pr
10450 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65  agmaVtab;.typede
10460 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  f struct PragmaV
10470 74 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61  tabCursor Pragma
10480 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75  VtabCursor;.stru
10490 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a  ct PragmaVtab {.
104a0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62    sqlite3_vtab b
104b0 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ase;        /* B
104c0 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
104d0 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
104e0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
104f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10500 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10510 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20  ion to which it 
10520 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e  belongs */.  con
10530 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
10540 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
10550 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  f the pragma */.
10560 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20    u8 nHidden;   
10570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10580 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20  umber of hidden 
10590 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
105a0 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20  iHidden;        
105b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
105c0 6f 66 20 74 68 65 20 66 69 72 73 74 20 68 69 64  of the first hid
105d0 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b  den column */.};
105e0 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74  .struct PragmaVt
105f0 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  abCursor {.  sql
10600 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
10610 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63   base; /* Base c
10620 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66  lass.  Must be f
10630 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
10640 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b  3_stmt *pPragma;
10650 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d      /* The pragm
10660 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  a statement to r
10670 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69  un */.  sqlite_i
10680 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20  nt64 iRowid;    
10690 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
106a0 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a  id */.  char *az
106b0 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  Arg[2];         
106c0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
106d0 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  e argument and s
106e0 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  chema */.};../* 
106f0 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
10700 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
10710 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e  xConnect method.
10720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10730 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
10740 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10750 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
10760 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
10770 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
10780 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
10790 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
107a0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
107b0 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
107c0 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e   *pPragma = (con
107d0 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70  st PragmaName*)p
107e0 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  Aux;.  PragmaVta
107f0 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69  b *pTab = 0;.  i
10800 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
10810 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d  j;.  char cSep =
10820 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d   '(';.  StrAccum
10830 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75   acc;.  char zBu
10840 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45  f[200];..  UNUSE
10850 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
10860 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10870 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20 73  METER(argv);.  s
10880 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
10890 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 75 66  it(&acc, 0, zBuf
108a0 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
108b0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  0);.  sqlite3Str
108c0 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26  AccumAppendAll(&
108d0 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41 42  acc, "CREATE TAB
108e0 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69 3d  LE x");.  for(i=
108f0 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69 50  0, j=pPragma->iP
10900 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72 61  ragCName; i<pPra
10910 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 3b  gma->nPragCName;
10920 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
10930 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
10940 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c  acc, "%c\"%s\"",
10950 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65   cSep, pragCName
10960 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d  [j]);.    cSep =
10970 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   ',';.  }.  if( 
10980 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  i==0 ){.    sqli
10990 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c  te3XPrintf(&acc,
109a0 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50 72 61   "(\"%s\"", pPra
109b0 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  gma->zName);.   
109c0 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20   cSep = ',';.   
109d0 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20   i++;.  }.  j = 
109e0 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  0;.  if( pPragma
109f0 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61  ->mPragFlg & Pra
10a00 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29 7b 0a  gFlg_Result1 ){.
10a10 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
10a20 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63  cumAppendAll(&ac
10a30 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22  c, ",arg HIDDEN"
10a40 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
10a50 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d    if( pPragma->m
10a60 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46  PragFlg & (PragF
10a70 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61  lg_SchemaOpt|Pra
10a80 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20  gFlg_SchemaReq) 
10a90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  ){.    sqlite3St
10aa0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
10ab0 26 61 63 63 2c 20 22 2c 73 63 68 65 6d 61 20 48  &acc, ",schema H
10ac0 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b  IDDEN");.    j++
10ad0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
10ae0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 61  trAccumAppend(&a
10af0 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 73  cc, ")", 1);.  s
10b00 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
10b10 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 61 73  nish(&acc);.  as
10b20 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 42 75  sert( strlen(zBu
10b30 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66  f) < sizeof(zBuf
10b40 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  )-1 );.  rc = sq
10b50 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
10b60 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20 20  ab(db, zBuf);.  
10b70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10b80 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  K ){.    pTab = 
10b90 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73 71 6c  (PragmaVtab*)sql
10ba0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
10bb0 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b  of(PragmaVtab));
10bc0 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
10bd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
10be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
10c00 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69  mset(pTab, 0, si
10c10 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29  zeof(PragmaVtab)
10c20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  );.      pTab->p
10c30 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b 0a  Name = pPragma;.
10c40 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d        pTab->db =
10c50 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   db;.      pTab-
10c60 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20 20  >iHidden = i;.  
10c70 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64 64 65      pTab->nHidde
10c80 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d  n = j;.    }.  }
10c90 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72 72  else{.    *pzErr
10ca0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10cb0 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
10cc0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
10cd0 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28  }..  *ppVtab = (
10ce0 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 54  sqlite3_vtab*)pT
10cf0 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ab;.  return rc;
10d00 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d  .}../* .** Pragm
10d10 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
10d20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65  module xDisconne
10d30 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ct method..*/.st
10d40 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
10d50 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  tabDisconnect(sq
10d60 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
10d70 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  b){.  PragmaVtab
10d80 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
10d90 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 73  Vtab*)pVtab;.  s
10da0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62  qlite3_free(pTab
10db0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67  TE_OK;.}../* Fig
10dd0 75 72 65 20 6f 75 74 20 74 68 65 20 62 65 73 74  ure out the best
10de0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 74 6f   index to use to
10df0 20 73 65 61 72 63 68 20 61 20 70 72 61 67 6d 61   search a pragma
10e00 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
10e10 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
10e20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79 20 69  not really any i
10e30 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20 20 42  ndex choices.  B
10e40 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 65 6e  ut we want to en
10e50 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a 20 71  courage the.** q
10e60 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f 20  uery planner to 
10e70 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  give == constrai
10e80 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20 68  nts on as many h
10e90 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73  idden parameters
10ea0 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c   as.** possible,
10eb0 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c 79 20   and especially 
10ec0 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68 69 64  on the first hid
10ed0 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 20  den parameter.  
10ee0 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 68  So return a.** h
10ef0 69 67 68 20 63 6f 73 74 20 69 66 20 68 69 64 64  igh cost if hidd
10f00 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  en parameters ar
10f10 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e  e unconstrained.
10f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10f30 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64  ragmaVtabBestInd
10f40 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
10f50 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
10f60 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
10f70 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  fo){.  PragmaVta
10f80 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
10f90 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20 63 6f  aVtab*)tab;.  co
10fa0 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
10fb0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
10fc0 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74  int *pConstraint
10fd0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
10fe0 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20  int seen[2];..  
10ff0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
11000 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  tedCost = (doubl
11010 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  e)1;.  if( pTab-
11020 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20 72  >nHidden==0 ){ r
11030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11040 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74   }.  pConstraint
11050 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
11060 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65 65 6e  nstraint;.  seen
11070 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e 5b  [0] = 0;.  seen[
11080 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  1] = 0;.  for(i=
11090 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
110a0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
110b0 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b   pConstraint++){
110c0 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72  .    if( pConstr
110d0 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20  aint->usable==0 
110e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
110f0 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
11100 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op!=SQLITE_INDE
11110 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
11120 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11130 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
11140 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62 2d  >iColumn < pTab-
11150 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e 74 69  >iHidden ) conti
11160 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43 6f  nue;.    j = pCo
11170 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
11180 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64 64 65  n - pTab->iHidde
11190 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  n;.    assert( j
111a0 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65 65 6e   < 2 );.    seen
111b0 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20  [j] = i+1;.  }. 
111c0 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30 20   if( seen[0]==0 
111d0 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ){.    pIdxInfo-
111e0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
111f0 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34 38 33   (double)2147483
11200 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  647;.    pIdxInf
11210 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
11220 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b 0a 20   = 2147483647;. 
11230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11240 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 73  _OK;.  }.  j = s
11250 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64 78  een[0]-1;.  pIdx
11260 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
11270 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e  tUsage[j].argvIn
11280 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64 78 49  dex = 1;.  pIdxI
11290 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
112a0 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20  Usage[j].omit = 
112b0 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b 31 5d  1;.  if( seen[1]
112c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
112d0 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49 6e  ITE_OK;.  pIdxIn
112e0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
112f0 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b 0a  t = (double)20;.
11300 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
11310 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30 3b 0a  matedRows = 20;.
11320 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b    j = seen[1]-1;
11330 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
11340 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
11350 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a  .argvIndex = 2;.
11360 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
11370 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e  straintUsage[j].
11380 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  omit = 1;.  retu
11390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
113a0 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  ./* Create a new
113b0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
113c0 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
113d0 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  able */.static i
113e0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65  nt pragmaVtabOpe
113f0 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
11400 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVtab, sqlite3_v
11410 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
11420 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61  ursor){.  Pragma
11430 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
11440 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72 61 67  ;.  pCsr = (Prag
11450 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 73 71  maVtabCursor*)sq
11460 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
11470 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 69  eof(*pCsr));.  i
11480 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72 65 74  f( pCsr==0 ) ret
11490 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
114a0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c  ;.  memset(pCsr,
114b0 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d   0, sizeof(Pragm
114c0 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b 0a 20  aVtabCursor));. 
114d0 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61   pCsr->base.pVta
114e0 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70 70  b = pVtab;.  *pp
114f0 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72 2d 3e  Cursor = &pCsr->
11500 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  base;.  return S
11510 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
11520 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65 6e  Clear all conten
11530 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20 76 69  t from pragma vi
11540 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
11550 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or. */.static vo
11560 69 64 20 70 72 61 67 6d 61 56 74 61 62 43 75 72  id pragmaVtabCur
11570 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d 61 56  sorClear(PragmaV
11580 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 29  tabCursor *pCsr)
11590 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
115a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
115b0 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20  sr->pPragma);.  
115c0 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20  pCsr->pPragma = 
115d0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
115e0 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e  ArraySize(pCsr->
115f0 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20 20  azArg); i++){.  
11600 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11610 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a  Csr->azArg[i]);.
11620 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b      pCsr->azArg[
11630 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = 0;.  }.}../
11640 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67 6d 61  * Close a pragma
11650 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
11660 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20  ursor */.static 
11670 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6c  int pragmaVtabCl
11680 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ose(sqlite3_vtab
11690 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
116a0 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
116b0 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d  r *pCsr = (Pragm
116c0 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63 75 72  aVtabCursor*)cur
116d0 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75  ;.  pragmaVtabCu
116e0 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b  rsorClear(pCsr);
116f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11700 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCsr);.  return 
11710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11720 20 41 64 76 61 6e 63 65 20 74 68 65 20 70 72 61   Advance the pra
11730 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
11740 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
11750 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61 74  next row */.stat
11760 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
11770 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74  bNext(sqlite3_vt
11780 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
11790 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
117a0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
117b0 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
117c0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
117d0 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  or;.  int rc = S
117e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
117f0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 78 52  Increment the xR
11800 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  owid value */.  
11810 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a  pCsr->iRowid++;.
11820 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
11830 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69 66 28  pPragma );.  if(
11840 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c   SQLITE_ROW!=sql
11850 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e  ite3_step(pCsr->
11860 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20 20  pPragma) ){.    
11870 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
11880 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61  alize(pCsr->pPra
11890 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  gma);.    pCsr->
118a0 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20  pPragma = 0;.   
118b0 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   pragmaVtabCurso
118c0 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20  rClear(pCsr);.  
118d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
118e0 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20  ../* .** Pragma 
118f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
11900 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74  dule xFilter met
11910 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
11920 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c  nt pragmaVtabFil
11930 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
11940 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
11950 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20  bCursor, .  int 
11960 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  idxNum, const ch
11970 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e  ar *idxStr,.  in
11980 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
11990 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
119a0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
119b0 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
119c0 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
119d0 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61  tabCursor;.  Pra
119e0 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
119f0 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56  (PragmaVtab*)(pV
11a00 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
11a10 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  );.  int rc;.  i
11a20 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41 63  nt i, j;.  StrAc
11a30 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20  cum acc;.  char 
11a40 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45 44  *zSql;..  UNUSED
11a50 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78 4e 75  _PARAMETER(idxNu
11a60 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  m);.  UNUSED_PAR
11a70 41 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a  AMETER(idxStr);.
11a80 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73    pragmaVtabCurs
11a90 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20  orClear(pCsr);. 
11aa0 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61 6d   j = (pTab->pNam
11ab0 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  e->mPragFlg & Pr
11ac0 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29 21 3d  agFlg_Result1)!=
11ad0 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f 72  0 ? 0 : 1;.  for
11ae0 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
11af0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 73 73  +, j++){.    ass
11b00 65 72 74 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ert( j<ArraySize
11b10 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b  (pCsr->azArg) );
11b20 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67  .    pCsr->azArg
11b30 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [j] = sqlite3_mp
11b40 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
11b50 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
11b60 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20 69 66  rgv[i]));.    if
11b70 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d  ( pCsr->azArg[j]
11b80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
11b90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11bb0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
11bc0 74 28 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c  t(&acc, 0, 0, 0,
11bd0 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69   pTab->db->aLimi
11be0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
11bf0 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73  QL_LENGTH]);.  s
11c00 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
11c10 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 50  pendAll(&acc, "P
11c20 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28 20  RAGMA ");.  if( 
11c30 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20 29  pCsr->azArg[1] )
11c40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
11c50 69 6e 74 66 28 26 61 63 63 2c 20 22 25 51 2e 22  intf(&acc, "%Q."
11c60 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  , pCsr->azArg[1]
11c70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11c80 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
11c90 6c 28 26 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e  l(&acc, pTab->pN
11ca0 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  ame->zName);.  i
11cb0 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30  f( pCsr->azArg[0
11cc0 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
11cd0 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 3d  XPrintf(&acc, "=
11ce0 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  %Q", pCsr->azArg
11cf0 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  [0]);.  }.  zSql
11d00 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
11d10 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a  umFinish(&acc);.
11d20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
11d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11d40 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  MEM;.  rc = sqli
11d50 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
11d60 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  Tab->db, zSql, -
11d70 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d  1, &pCsr->pPragm
11d80 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  a, 0);.  sqlite3
11d90 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
11da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11db0 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61   ){.    pTab->ba
11dc0 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
11dd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
11de0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
11df0 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20  g(pTab->db));.  
11e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11e10 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61  .  return pragma
11e20 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43 75  VtabNext(pVtabCu
11e30 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsor);.}../*.** 
11e40 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
11e50 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66  able module xEof
11e60 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
11e70 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
11e80 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61  bEof(sqlite3_vta
11e90 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
11ea0 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61  ursor){.  Pragma
11eb0 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
11ec0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
11ed0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
11ee0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73  r;.  return (pCs
11ef0 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a  r->pPragma==0);.
11f00 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d  }../* The xColum
11f10 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20  n method simply 
11f20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72  returns the corr
11f30 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
11f40 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41   from.** the PRA
11f50 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  GMA.  .*/.static
11f60 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
11f70 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33  olumn(.  sqlite3
11f80 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
11f90 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71  tabCursor, .  sq
11fa0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
11fb0 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a  tx, .  int i.){.
11fc0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
11fd0 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
11fe0 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
11ff0 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61  tabCursor;.  Pra
12000 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
12010 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56  (PragmaVtab*)(pV
12020 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
12030 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d  );.  if( i<pTab-
12040 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20  >iHidden ){.    
12050 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
12060 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
12070 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
12080 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29  Csr->pPragma, i)
12090 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
120a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
120b0 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61  ext(ctx, pCsr->a
120c0 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69  zArg[i-pTab->iHi
120d0 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f  dden],-1,SQLITE_
120e0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
120f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12100 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  OK;.}../* .** Pr
12110 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
12120 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64  le module xRowid
12130 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
12140 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12150 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  bRowid(sqlite3_v
12160 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
12170 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f  bCursor, sqlite_
12180 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61  int64 *p){.  Pra
12190 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
121a0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
121b0 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
121c0 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73  rsor;.  *p = pCs
121d0 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74  r->iRowid;.  ret
121e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
121f0 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20  ../* The pragma 
12200 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
12210 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ject */.static c
12220 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
12230 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f  ule pragmaVtabMo
12240 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20  dule = {.  0,   
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
12270 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
122a0 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62 6c   - create a tabl
122b0 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  e */.  pragmaVta
122c0 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  bConnect,       
122d0 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
122e0 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20  - connect to an 
122f0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a  existing table *
12300 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42 65  /.  pragmaVtabBe
12310 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  stIndex,        
12320 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d   /* xBestIndex -
12330 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63   Determine searc
12340 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
12350 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e  pragmaVtabDiscon
12360 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
12370 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69  xDisconnect - Di
12380 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20  sconnect from a 
12390 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20  table */.  0,   
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74          /* xDest
123c0 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62  roy - Drop a tab
123d0 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
123e0 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  abOpen,         
123f0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
12400 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
12410 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f  .  pragmaVtabClo
12420 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
12430 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
12440 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
12450 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72  pragmaVtabFilter
12460 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12470 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
12480 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
12490 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61  ints */.  pragma
124a0 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20  VtabNext,       
124b0 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
124c0 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
124d0 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
124e0 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  abEof,          
124f0 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a       /* xEof */.
12500 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75    pragmaVtabColu
12510 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
12520 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
12530 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d   data */.  pragm
12540 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20  aVtabRowid,     
12550 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
12560 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
12570 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72 69  /* xUpdate - wri
125a0 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  te data */.  0, 
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
125d0 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e  gin - begin tran
125e0 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
12610 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61  nc - sync transa
12620 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
12650 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e  it - commit tran
12660 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
12690 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63  llback - rollbac
126a0 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  k transaction */
126b0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  /* xFindFunction
126e0 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72   - function over
126f0 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20  loading */.  0, 
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
12720 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68  name - rename th
12730 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  e table */.  0, 
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
12760 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
12790 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20  lease */.  0    
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
127c0 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  backTo */.};../*
127d0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
127e0 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20   if zTabName is 
127f0 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20  really the name 
12800 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66  of a pragma.  If
12810 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20   it is,.** then 
12820 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e  register an epon
12830 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
12840 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72 61  ble for that pra
12850 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  gma and return.*
12860 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
12870 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74  he Module object
12880 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72   for the new vir
12890 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d  tual table..*/.M
128a0 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72  odule *sqlite3Pr
128b0 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65 72  agmaVtabRegister
128c0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
128d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
128e0 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
128f0 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61  Name *pName;.  a
12900 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73  ssert( sqlite3_s
12910 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  trnicmp(zName, "
12920 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20  pragma_", 7)==0 
12930 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61  );.  pName = pra
12940 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b  gmaLocate(zName+
12950 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d  7);.  if( pName=
12960 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12970 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72   if( (pName->mPr
12980 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
12990 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67  _Result0|PragFlg
129a0 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20  _Result1))==0 ) 
129b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
129c0 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
129d0 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
129e0 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20  , zName)==0 );. 
129f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
12a00 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28  tabCreateModule(
12a10 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67  db, zName, &prag
12a20 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76  maVtabModule, (v
12a30 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a  oid*)pName, 0);.
12a40 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
12a50 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12a60 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66  TABLE */..#endif
12a70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12a80 50 52 41 47 4d 41 20 2a 2f 0a                    PRAGMA */.