/ Hex Artifact Content
Login

Artifact 0e7a7c6f1c6fd8ff50c0fff65b8bb80174bc49c5:


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 0a 20 20 20 26 26 20 28 28 70 50 72  ==0 .   && ((pPr
3390: 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26  agma->mPragFlg &
33a0: 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d   PragFlg_NoColum
33b0: 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a 52 69 67 68  ns1)==0 || zRigh
33c0: 74 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 73  t==0).  ){.    s
33d0: 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f  etPragmaResultCo
33e0: 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72  lumnNames(v, pPr
33f0: 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  agma);.  }..  /*
3400: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70   Jump to the app
3410: 72 6f 70 72 69 61 74 65 20 70 72 61 67 6d 61 20  ropriate pragma 
3420: 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 73 77 69  handler */.  swi
3430: 74 63 68 28 20 70 50 72 61 67 6d 61 2d 3e 65 50  tch( pPragma->eP
3440: 72 61 67 54 79 70 20 29 7b 0a 20 20 0a 23 69 66  ragTyp ){.  .#if
3450: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3460: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
3470: 4d 41 53 29 20 26 26 20 21 64 65 66 69 6e 65 64  MAS) && !defined
3480: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50  (SQLITE_OMIT_DEP
3490: 52 45 43 41 54 45 44 29 0a 20 20 2f 2a 0a 20 20  RECATED).  /*.  
34a0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
34b0: 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68  ma.]default_cach
34c0: 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  e_size.  **  PRA
34d0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66  GMA [schema.]def
34e0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d  ault_cache_size=
34f0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
3500: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
3510: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ts the current p
3520: 65 72 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e  ersistent settin
3530: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
3540: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
3550: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
3560: 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ned is the maxim
3570: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  um number of.  *
3580: 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  * pages in the p
3590: 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  age cache.  The 
35a0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
35b0: 20 62 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e   both the curren
35c0: 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  t.  ** page cach
35d0: 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64  e size value and
35e0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
35f0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
3600: 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65  value.  ** store
3610: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
3620: 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e file..  **.  *
3630: 2a 20 4f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  * Older versions
3640: 20 6f 66 20 53 51 4c 69 74 65 20 77 6f 75 6c 64   of SQLite would
3650: 20 73 65 74 20 74 68 65 20 64 65 66 61 75 6c 74   set the default
3660: 20 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 61   cache size to a
3670: 0a 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 20 6e  .  ** negative n
3680: 75 6d 62 65 72 20 74 6f 20 69 6e 64 69 63 61 74  umber to indicat
3690: 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  e synchronous=OF
36a0: 46 2e 20 20 54 68 65 73 65 20 64 61 79 73 2c 20  F.  These days, 
36b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a  synchronous.  **
36c0: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 20 62 79   is always on by
36d0: 20 64 65 66 61 75 6c 74 20 72 65 67 61 72 64 6c   default regardl
36e0: 65 73 73 20 6f 66 20 74 68 65 20 73 69 67 6e 20  ess of the sign 
36f0: 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  of the default c
3700: 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 2e 20  ache.  ** size. 
3710: 20 42 75 74 20 63 6f 6e 74 69 6e 75 65 20 74 6f   But continue to
3720: 20 74 61 6b 65 20 74 68 65 20 61 62 73 6f 6c 75   take the absolu
3730: 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  te value of the 
3740: 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20  default cache.  
3750: 2a 2a 20 73 69 7a 65 20 6f 66 20 68 69 73 74 6f  ** size of histo
3760: 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
3770: 69 74 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ity..  */.  case
3780: 20 50 72 61 67 54 79 70 5f 44 45 46 41 55 4c 54   PragTyp_DEFAULT
3790: 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20  _CACHE_SIZE: {. 
37a0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
37b0: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
37c0: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
37d0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
37e0: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 67 65 74  t VdbeOpList get
37f0: 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a  CacheSize[] = {.
3800: 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73        { OP_Trans
3810: 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 20 20  action, 0, 0,   
3820: 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20       0},        
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 0 */.      {
3850: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
3860: 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 42 54   0, 1,        BT
3870: 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  REE_DEFAULT_CACH
3880: 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a 20 31 20 2a  E_SIZE},  /* 1 *
3890: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50  /.      { OP_IfP
38a0: 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20  os,       1, 8, 
38b0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
38c0: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
38d0: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
38e0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
38f0: 75 62 74 72 61 63 74 2c 20 20 20 20 31 2c 20 32  ubtract,    1, 2
3900: 2c 20 20 20 20 20 20 20 20 31 7d 2c 0a 20 20 20  ,        1},.   
3910: 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20     { OP_IfPos,  
3920: 20 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20       1, 8,      
3930: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
3940: 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c  _Integer,     0,
3950: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   1,        0},  
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20         /* 6 */. 
3980: 20 20 20 20 20 7b 20 4f 50 5f 4e 6f 6f 70 2c 20       { OP_Noop, 
3990: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
39a0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
39b0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
39c0: 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 1,        0},
39d0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65  .    };.    Vdbe
39e0: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 73 71 6c  Op *aOp;.    sql
39f0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
3a00: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  e(v, iDb);.    i
3a10: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
3a20: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
3a30: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c   += 2;.      sql
3a40: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
3a50: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76  MallocRequired(v
3a60: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43  , ArraySize(getC
3a70: 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  acheSize));.    
3a80: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
3a90: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
3aa0: 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61 63  ArraySize(getCac
3ab0: 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68  heSize), getCach
3ac0: 65 53 69 7a 65 2c 20 69 4c 6e 29 3b 0a 20 20 20  eSize, iLn);.   
3ad0: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
3ae0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
3af0: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
3b00: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
3b10: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
3b20: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
3b30: 20 20 20 61 4f 70 5b 36 5d 2e 70 31 20 3d 20 53     aOp[6].p1 = S
3b40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
3b50: 43 48 45 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65  CHE_SIZE;.    }e
3b60: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  lse{.      int s
3b70: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ize = sqlite3Abs
3b80: 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f  Int32(sqlite3Ato
3b90: 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  i(zRight));.    
3ba0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
3bb0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
3bc0: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
3bd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3be0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
3bf0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
3c00: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
3c10: 53 49 5a 45 2c 20 73 69 7a 65 29 3b 0a 20 20 20  SIZE, size);.   
3c20: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3c30: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3c40: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
3c50: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68  .      pDb->pSch
3c60: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20  ema->cache_size 
3c70: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
3c80: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
3c90: 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c  heSize(pDb->pBt,
3ca0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
3cb0: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
3cc0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
3cd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3ce0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3cf0: 41 47 4d 41 53 20 26 26 20 21 53 51 4c 49 54 45  AGMAS && !SQLITE
3d00: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
3d10: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
3d20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
3d30: 47 45 52 5f 50 52 41 47 4d 41 53 29 0a 20 20 2f  GER_PRAGMAS).  /
3d40: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
3d50: 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73 69 7a  schema.]page_siz
3d60: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  e.  **  PRAGMA [
3d70: 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73 69 7a  schema.]page_siz
3d80: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
3d90: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
3da0: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
3db0: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65   setting for the
3dc0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
3dd0: 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  age size in byte
3de0: 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  s.  The second f
3df0: 6f 72 6d 20 73 65 74 73 20 74 68 65 0a 20 20 2a  orm sets the.  *
3e00: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
3e10: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 54 68 65  size value.  The
3e20: 20 76 61 6c 75 65 20 63 61 6e 20 6f 6e 6c 79 20   value can only 
3e30: 62 65 20 73 65 74 20 69 66 0a 20 20 2a 2a 20 74  be set if.  ** t
3e40: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
3e50: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 72 65  not yet been cre
3e60: 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
3e70: 65 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f 53  e PragTyp_PAGE_S
3e80: 49 5a 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65  IZE: {.    Btree
3e90: 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74   *pBt = pDb->pBt
3ea0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
3eb0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t!=0 );.    if( 
3ec0: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
3ed0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 41 4c 57 41   int size = ALWA
3ee0: 59 53 28 70 42 74 29 20 3f 20 73 71 6c 69 74 65  YS(pBt) ? sqlite
3ef0: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
3f00: 65 28 70 42 74 29 20 3a 20 30 3b 0a 20 20 20 20  e(pBt) : 0;.    
3f10: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
3f20: 74 28 76 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  t(v, size);.    
3f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
3f40: 4d 61 6c 6c 6f 63 20 6d 61 79 20 66 61 69 6c 20  Malloc may fail 
3f50: 77 68 65 6e 20 73 65 74 74 69 6e 67 20 74 68 65  when setting the
3f60: 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 73 20 74   page-size, as t
3f70: 68 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  here is an inter
3f80: 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 62 75 66  nal.      ** buf
3f90: 66 65 72 20 74 68 61 74 20 74 68 65 20 70 61 67  fer that the pag
3fa0: 65 72 20 6d 6f 64 75 6c 65 20 72 65 73 69 7a 65  er module resize
3fb0: 73 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  s using sqlite3_
3fc0: 72 65 61 6c 6c 6f 63 28 29 2e 0a 20 20 20 20 20  realloc()..     
3fd0: 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65   */.      db->ne
3fe0: 78 74 50 61 67 65 73 69 7a 65 20 3d 20 73 71 6c  xtPagesize = sql
3ff0: 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
4000: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
4010: 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65  TE_NOMEM==sqlite
4020: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
4030: 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50  e(pBt, db->nextP
4040: 61 67 65 73 69 7a 65 2c 2d 31 2c 30 29 20 29 7b  agesize,-1,0) ){
4050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4060: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
4070: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4080: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
4090: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
40a0: 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65  chema.]secure_de
40b0: 6c 65 74 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  lete.  **  PRAGM
40c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72  A [schema.]secur
40d0: 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46 46 0a  e_delete=ON/OFF.
40e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
40f0: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
4100: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4110: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
4120: 2a 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  * secure_delete 
4130: 66 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e  flag.  The secon
4140: 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74  d form changes t
4150: 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
4160: 0a 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69  .  ** flag setti
4170: 6e 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74  ng and reports t
4180: 68 65 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a  henew value..  *
4190: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
41a0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20  _SECURE_DELETE: 
41b0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
41c0: 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20   = pDb->pBt;.   
41d0: 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20   int b = -1;.   
41e0: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
41f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
4200: 74 20 29 7b 0a 20 20 20 20 20 20 62 20 3d 20 73  t ){.      b = s
4210: 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
4220: 28 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  (zRight, 0);.   
4230: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d   }.    if( pId2-
4240: 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29 7b  >n==0 && b>=0 ){
4250: 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
4260: 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
4270: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29  i<db->nDb; ii++)
4280: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4290: 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
42a0: 74 65 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  te(db->aDb[ii].p
42b0: 42 74 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, b);.      }.
42c0: 20 20 20 20 7d 0a 20 20 20 20 62 20 3d 20 73 71      }.    b = sq
42d0: 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
42e0: 44 65 6c 65 74 65 28 70 42 74 2c 20 62 29 3b 0a  Delete(pBt, b);.
42f0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
4300: 49 6e 74 28 76 2c 20 62 29 3b 0a 20 20 20 20 62  Int(v, b);.    b
4310: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
4320: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
4330: 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f 63  hema.]max_page_c
4340: 6f 75 6e 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d  ount.  **  PRAGM
4350: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
4360: 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a  age_count=N.  **
4370: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
4380: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
4390: 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
43a0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
43b0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
43c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
43d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
43e0: 20 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 66 6f   .  ** second fo
43f0: 72 6d 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  rm attempts to c
4400: 68 61 6e 67 65 20 74 68 69 73 20 73 65 74 74 69  hange this setti
4410: 6e 67 2e 20 20 42 6f 74 68 0a 20 20 2a 2a 20 66  ng.  Both.  ** f
4420: 6f 72 6d 73 20 72 65 74 75 72 6e 20 74 68 65 20  orms return the 
4430: 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 2e  current setting.
4440: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61  .  **.  ** The a
4450: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
4460: 20 4e 20 69 73 20 75 73 65 64 2e 20 20 54 68 69   N is used.  Thi
4470: 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65  s is undocumente
4480: 64 20 61 6e 64 20 6d 69 67 68 74 0a 20 20 2a 2a  d and might.  **
4490: 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 6f 6e   change.  The on
44a0: 6c 79 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f  ly purpose is to
44b0: 20 70 72 6f 76 69 64 65 20 61 6e 20 65 61 73 79   provide an easy
44c0: 20 77 61 79 20 74 6f 20 74 65 73 74 0a 20 20 2a   way to test.  *
44d0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 41 62 73  * the sqlite3Abs
44e0: 49 6e 74 33 32 28 29 20 66 75 6e 63 74 69 6f 6e  Int32() function
44f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  **.  **  PRA
4500: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67  GMA [schema.]pag
4510: 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a  e_count.  **.  *
4520: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
4530: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
4540: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 61  the specified da
4550: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
4560: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 47 45  ase PragTyp_PAGE
4570: 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 69 6e  _COUNT: {.    in
4580: 74 20 69 52 65 67 3b 0a 20 20 20 20 73 71 6c 69  t iReg;.    sqli
4590: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
45a0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
45b0: 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70  ;.    iReg = ++p
45c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
45d0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 6f 6c 6f   if( sqlite3Tolo
45e0: 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27  wer(zLeft[0])=='
45f0: 70 27 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p' ){.      sqli
4600: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4610: 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 2c 20 69   OP_Pagecount, i
4620: 44 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  Db, iReg);.    }
4630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
4640: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4650: 20 4f 50 5f 4d 61 78 50 67 63 6e 74 2c 20 69 44   OP_MaxPgcnt, iD
4660: 62 2c 20 69 52 65 67 2c 20 0a 20 20 20 20 20 20  b, iReg, .      
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33    sqlite3AbsInt3
4690: 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  2(sqlite3Atoi(zR
46a0: 69 67 68 74 29 29 29 3b 0a 20 20 20 20 7d 0a 20  ight)));.    }. 
46b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
46c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
46d0: 74 52 6f 77 2c 20 69 52 65 67 2c 20 31 29 3b 0a  tRow, iReg, 1);.
46e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
46f0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4700: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69  A [schema.]locki
4710: 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52  ng_mode.  **  PR
4720: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f  AGMA [schema.]lo
4730: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f  cking_mode = (no
4740: 72 6d 61 6c 7c 65 78 63 6c 75 73 69 76 65 29 0a  rmal|exclusive).
4750: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4760: 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  Typ_LOCKING_MODE
4770: 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
4780: 61 72 20 2a 7a 52 65 74 20 3d 20 22 6e 6f 72 6d  ar *zRet = "norm
4790: 61 6c 22 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f  al";.    int eMo
47a0: 64 65 20 3d 20 67 65 74 4c 6f 63 6b 69 6e 67 4d  de = getLockingM
47b0: 6f 64 65 28 7a 52 69 67 68 74 29 3b 0a 0a 20 20  ode(zRight);..  
47c0: 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30    if( pId2->n==0
47d0: 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   && eMode==PAGER
47e0: 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
47f0: 52 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  RY ){.      /* S
4800: 69 6d 70 6c 65 20 22 50 52 41 47 4d 41 20 6c 6f  imple "PRAGMA lo
4810: 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22 20 73 74 61  cking_mode;" sta
4820: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
4830: 61 20 71 75 65 72 79 20 66 6f 72 0a 20 20 20 20  a query for.    
4840: 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
4850: 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
4860: 20 6d 6f 64 65 20 28 77 68 69 63 68 20 6d 61 79   mode (which may
4870: 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 74 6f   be different to
4880: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  .      ** the lo
4890: 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f 66 20 74 68  cking-mode of th
48a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 29  e main database)
48b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
48c0: 20 65 4d 6f 64 65 20 3d 20 64 62 2d 3e 64 66 6c   eMode = db->dfl
48d0: 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d  tLockMode;.    }
48e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61 67 65  else{.      Page
48f0: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20  r *pPager;.     
4900: 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20   if( pId2->n==0 
4910: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
4920: 69 73 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  is indicates tha
4930: 74 20 6e 6f 20 64 61 74 61 62 61 73 65 20 6e 61  t no database na
4940: 6d 65 20 77 61 73 20 73 70 65 63 69 66 69 65 64  me was specified
4950: 20 61 73 20 70 61 72 74 0a 20 20 20 20 20 20 20   as part.       
4960: 20 2a 2a 20 6f 66 20 74 68 65 20 50 52 41 47 4d   ** of the PRAGM
4970: 41 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68  A command. In th
4980: 69 73 20 63 61 73 65 20 74 68 65 20 6c 6f 63 6b  is case the lock
4990: 69 6e 67 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  ing-mode must be
49a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
49b0: 6f 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  on all attached 
49c0: 64 61 74 61 62 61 73 65 73 2c 20 61 73 20 77 65  databases, as we
49d0: 6c 6c 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64  ll as the main d
49e0: 62 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  b file..        
49f0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c  **.        ** Al
4a00: 73 6f 2c 20 74 68 65 20 73 71 6c 69 74 65 33 2e  so, the sqlite3.
4a10: 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76 61 72  dfltLockMode var
4a20: 69 61 62 6c 65 20 69 73 20 73 65 74 20 73 6f 20  iable is set so 
4a30: 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
4a40: 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74 6c 79  any subsequently
4a50: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
4a60: 73 65 73 20 61 6c 73 6f 20 75 73 65 20 74 68 65  ses also use the
4a70: 20 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 20   specified.     
4a80: 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f     ** locking mo
4a90: 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  de..        */. 
4aa0: 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
4ab0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 44         assert(pD
4ac0: 62 3d 3d 26 64 62 2d 3e 61 44 62 5b 30 5d 29 3b  b==&db->aDb[0]);
4ad0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ae0: 32 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  2; ii<db->nDb; i
4af0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
4b00: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
4b10: 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
4b20: 44 62 5b 69 69 5d 2e 70 42 74 29 3b 0a 20 20 20  Db[ii].pBt);.   
4b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
4b40: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4b50: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4b60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b70: 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64   db->dfltLockMod
4b80: 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
4b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
4ba0: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
4bb0: 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74  eePager(pDb->pBt
4bc0: 29 3b 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  );.      eMode =
4bd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
4be0: 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67 65 72 2c  kingMode(pPager,
4bf0: 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a   eMode);.    }..
4c00: 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
4c10: 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
4c20: 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
4c30: 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
4c40: 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
4c50: 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
4c60: 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
4c70: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4c80: 45 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  E_EXCLUSIVE ){. 
4c90: 20 20 20 20 20 7a 52 65 74 20 3d 20 22 65 78 63       zRet = "exc
4ca0: 6c 75 73 69 76 65 22 3b 0a 20 20 20 20 7d 0a 20  lusive";.    }. 
4cb0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
4cc0: 65 78 74 28 76 2c 20 7a 52 65 74 29 3b 0a 20 20  ext(v, zRet);.  
4cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4ce0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
4cf0: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
4d00: 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47  _mode.  **  PRAG
4d10: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72  MA [schema.]jour
4d20: 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20  nal_mode =.  ** 
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 20 20 28 64 65 6c 65 74 65 7c 70 65 72       (delete|per
4d50: 73 69 73 74 7c 6f 66 66 7c 74 72 75 6e 63 61 74  sist|off|truncat
4d60: 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66  e|memory|wal|off
4d70: 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ).  */.  case Pr
4d80: 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f  agTyp_JOURNAL_MO
4d90: 44 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65 4d  DE: {.    int eM
4da0: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ode;        /* O
4db0: 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ne of the PAGER_
4dc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20  JOURNALMODE_XXX 
4dd0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 69  symbols */.    i
4de0: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
4df0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
4e00: 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69   */..    if( zRi
4e10: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
4e20: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
4e30: 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 6f  o "=MODE" part o
4e40: 66 20 74 68 65 20 70 72 61 67 6d 61 2c 20 64 6f  f the pragma, do
4e50: 20 61 20 71 75 65 72 79 20 66 6f 72 20 74 68 65   a query for the
4e60: 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
4e70: 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  t mode */.      
4e80: 65 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  eMode = PAGER_JO
4e90: 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b  URNALMODE_QUERY;
4ea0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4eb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
4ec0: 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ode;.      int n
4ed0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
4ee0: 33 30 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  30(zRight);.    
4ef0: 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30 3b 20 28    for(eMode=0; (
4f00: 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 4a  zMode = sqlite3J
4f10: 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65  ournalModename(e
4f20: 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d 6f 64 65  Mode))!=0; eMode
4f30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
4f40: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
4f50: 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64 65 2c 20  (zRight, zMode, 
4f60: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
4f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4f80: 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20   !zMode ){.     
4f90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 22 3d 4d     /* If the "=M
4fa0: 4f 44 45 22 20 70 61 72 74 20 64 6f 65 73 20 6e  ODE" part does n
4fb0: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 6b 6e 6f  ot match any kno
4fc0: 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  wn journal mode,
4fd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
4fe0: 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a 20   do a query */. 
4ff0: 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50         eMode = P
5000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
5010: 5f 51 55 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a  _QUERY;.      }.
5020: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4d      }.    if( eM
5030: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
5040: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 26 26 20  ALMODE_QUERY && 
5050: 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  pId2->n==0 ){.  
5060: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22      /* Convert "
5070: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
5080: 6f 64 65 22 20 69 6e 74 6f 20 22 50 52 41 47 4d  ode" into "PRAGM
5090: 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d  A main.journal_m
50a0: 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20 20 69 44  ode" */.      iD
50b0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 64  b = 0;.      pId
50c0: 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  2->n = 1;.    }.
50d0: 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e      for(ii=db->n
50e0: 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d  Db-1; ii>=0; ii-
50f0: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  -){.      if( db
5100: 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26  ->aDb[ii].pBt &&
5110: 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64   (ii==iDb || pId
5120: 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20  2->n==0) ){.    
5130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
5140: 73 65 73 42 74 72 65 65 28 76 2c 20 69 69 29 3b  sesBtree(v, ii);
5150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5170: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20 69 69  _JournalMode, ii
5180: 2c 20 31 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  , 1, eMode);.   
5190: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
51a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
51b0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
51c0: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 62 72 65  , 1, 1);.    bre
51d0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
51e0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
51f0: 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  ma.]journal_size
5200: 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41  _limit.  **  PRA
5210: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75  GMA [schema.]jou
5220: 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d  rnal_size_limit=
5230: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20  N.  **.  ** Get 
5240: 6f 72 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  or set the size 
5250: 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63  limit on rollbac
5260: 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  k journal files.
5270: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
5280: 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  gTyp_JOURNAL_SIZ
5290: 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50  E_LIMIT: {.    P
52a0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
52b0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
52c0: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
52d0: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b  i64 iLimit = -2;
52e0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
52f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5300: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
5310: 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a  ight, &iLimit);.
5320: 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
5330: 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d  <-1 ) iLimit = -
5340: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 69  1;.    }.    iLi
5350: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  mit = sqlite3Pag
5360: 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
5370: 69 74 28 70 50 61 67 65 72 2c 20 69 4c 69 6d 69  it(pPager, iLimi
5380: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69  t);.    returnSi
5390: 6e 67 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69  ngleInt(v, iLimi
53a0: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
53b0: 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   }..#endif /* SQ
53c0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
53d0: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a  PRAGMAS */..  /*
53e0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
53f0: 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75  chema.]auto_vacu
5400: 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  um.  **  PRAGMA 
5410: 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61  [schema.]auto_va
5420: 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  cuum=N.  **.  **
5430: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5440: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
5450: 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75  abase 'auto-vacu
5460: 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  um' parameter.. 
5470: 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73   ** The value is
5480: 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45   one of:  0 NONE
5490: 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d   1 FULL 2 INCREM
54a0: 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64  ENTAL.  */.#ifnd
54b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
54c0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65  UTOVACUUM.  case
54d0: 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41   PragTyp_AUTO_VA
54e0: 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65  CUUM: {.    Btre
54f0: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
5500: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
5510: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
5520: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
5530: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
5540: 74 28 76 2c 20 73 71 6c 69 74 65 33 42 74 72 65  t(v, sqlite3Btre
5550: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70  eGetAutoVacuum(p
5560: 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Bt));.    }else{
5570: 0a 20 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f  .      int eAuto
5580: 20 3d 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d   = getAutoVacuum
5590: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
55a0: 61 73 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30  assert( eAuto>=0
55b0: 20 26 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a   && eAuto<=2 );.
55c0: 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75        db->nextAu
55d0: 74 6f 76 61 63 20 3d 20 28 75 38 29 65 41 75 74  tovac = (u8)eAut
55e0: 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c  o;.      /* Call
55f0: 20 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29   SetAutoVacuum()
5600: 20 74 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69   to set initiali
5610: 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ze the internal 
5620: 61 75 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a  auto and.      *
5630: 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c  * incr-vacuum fl
5640: 61 67 73 2e 20 54 68 69 73 20 69 73 20 72 65 71  ags. This is req
5650: 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
5660: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  is connection.  
5670: 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74      ** creates t
5680: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5690: 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  . It is importan
56a0: 74 20 74 68 61 74 20 69 74 20 69 73 20 63 72 65  t that it is cre
56b0: 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73  ated.      ** as
56c0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
56d0: 63 61 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20  capable db..    
56e0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
56f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
5700: 75 74 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65  utoVacuum(pBt, e
5710: 41 75 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Auto);.      if(
5720: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5730: 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65  & (eAuto==1 || e
5740: 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20  Auto==2) ){.    
5750: 20 20 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74      /* When sett
5760: 69 6e 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63  ing the auto_vac
5770: 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68  uum mode to eith
5780: 65 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20  er "full" or .  
5790: 20 20 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d        ** "increm
57a0: 65 6e 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68  ental", write th
57b0: 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
57c0: 36 5d 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  6] in the databa
57d0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  se.        ** fi
57e0: 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  le. Before writi
57f0: 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63  ng to meta[6], c
5800: 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33  heck that meta[3
5810: 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20  ] indicates.    
5820: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
5830: 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75   really is an au
5840: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
5850: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
5860: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
5870: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
5880: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
5890: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
58a0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
58b0: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74  t VdbeOpList set
58c0: 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20  Meta6[] = {.    
58d0: 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73        { OP_Trans
58e0: 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20  action,    0,   
58f0: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
5900: 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20           0},    
5910: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
5920: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
5930: 65 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  e,     0,       
5940: 20 20 31 2c 20 20 20 20 20 20 20 20 20 42 54 52    1,         BTR
5950: 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f  EE_LARGEST_ROOT_
5960: 50 41 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20  PAGE},.         
5970: 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20   { OP_If,       
5980: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
5990: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
59a0: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20      0},    /* 2 
59b0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f  */.          { O
59c0: 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20  P_Halt,         
59d0: 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f    SQLITE_OK, OE_
59e0: 41 62 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20  Abort,          
59f0: 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20  0},    /* 3 */. 
5a00: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65           { OP_Se
5a10: 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c  tCookie,      0,
5a20: 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 49           BTREE_I
5a30: 4e 43 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20  NCR_VACUUM, 0}, 
5a40: 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20     /* 4 */.     
5a50: 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 56 64     };.        Vd
5a60: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20  beOp *aOp;.     
5a70: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
5a80: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5a90: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
5aa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72    sqlite3VdbeVer
5ab0: 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69  ifyNoMallocRequi
5ac0: 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65  red(v, ArraySize
5ad0: 28 73 65 74 4d 65 74 61 36 29 29 3b 0a 20 20 20  (setMeta6));.   
5ae0: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
5af0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
5b00: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74  v, ArraySize(set
5b10: 4d 65 74 61 36 29 2c 20 73 65 74 4d 65 74 61 36  Meta6), setMeta6
5b20: 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20  , iLn);.        
5b30: 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c  if( ONLY_IF_REAL
5b40: 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d  LOC_STRESS(aOp==
5b50: 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
5b60: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
5b70: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  iDb;.        aOp
5b80: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
5b90: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20        aOp[2].p2 
5ba0: 3d 20 69 41 64 64 72 2b 34 3b 0a 20 20 20 20 20  = iAddr+4;.     
5bb0: 20 20 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69     aOp[4].p1 = i
5bc0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5bd0: 34 5d 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d 20  4].p3 = eAuto - 
5be0: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
5bf0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
5c00: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  v, iDb);.      }
5c10: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
5c20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
5c30: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5c40: 5b 73 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65  [schema.]increme
5c50: 6e 74 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20  ntal_vacuum(N). 
5c60: 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74   **.  ** Do N st
5c70: 65 70 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74  eps of increment
5c80: 61 6c 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20  al vacuuming on 
5c90: 61 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  a database..  */
5ca0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5cb0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
5cc0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
5cd0: 4e 43 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55  NCREMENTAL_VACUU
5ce0: 4d 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69  M: {.    int iLi
5cf0: 6d 69 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69  mit, addr;.    i
5d00: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  f( zRight==0 || 
5d10: 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32  !sqlite3GetInt32
5d20: 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74  (zRight, &iLimit
5d30: 29 20 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29  ) || iLimit<=0 )
5d40: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
5d50: 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
5d60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65   }.    sqlite3Be
5d70: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
5d80: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
5d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5da0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5db0: 6e 74 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20  nteger, iLimit, 
5dc0: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
5dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5de0: 28 76 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75  (v, OP_IncrVacuu
5df0: 6d 2c 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76  m, iDb); VdbeCov
5e00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5e10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5e20: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
5e30: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
5e40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5e50: 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b  _AddImm, 1, -1);
5e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5e70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
5e80: 6f 73 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64  os, 1, addr); Vd
5e90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5ea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
5eb0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
5ec0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
5ed0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
5ee0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
5ef0: 52 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  R_PRAGMAS.  /*. 
5f00: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5f10: 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a  ema.]cache_size.
5f20: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
5f30: 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65  hema.]cache_size
5f40: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
5f50: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
5f60: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
5f70: 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f  local setting fo
5f80: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
5f90: 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20  cache size. The 
5fa0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
5fb0: 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20   the local.  ** 
5fc0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
5fd0: 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20  value.  If N is 
5fe0: 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20 74 68  positive then th
5ff0: 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e  at is the.  ** n
6000: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
6010: 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20 49 66  n the cache.  If
6020: 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20   N is negative, 
6030: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75  then the.  ** nu
6040: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 73  mber of pages is
6050: 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61   adjusted so tha
6060: 74 20 74 68 65 20 63 61 63 68 65 20 75 73 65 73  t the cache uses
6070: 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20   -N kibibytes.  
6080: 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20  ** of memory..  
6090: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
60a0: 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a  p_CACHE_SIZE: {.
60b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
60c0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
60d0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
60e0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
60f0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44  nSingleInt(v, pD
6110: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
6120: 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  e_size);.    }el
6130: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  se{.      int si
6140: 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69  ze = sqlite3Atoi
6150: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
6160: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6170: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
6180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
6190: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
61a0: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
61b0: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
61c0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
61d0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
61e0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
61f0: 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c  hema.]cache_spil
6200: 6c 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63  l.  **  PRAGMA c
6210: 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45  ache_spill=BOOLE
6220: 41 4e 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  AN.  **  PRAGMA 
6230: 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73  [schema.]cache_s
6240: 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  pill=N.  **.  **
6250: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
6260: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
6270: 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  ent local settin
6280: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
6290: 61 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c 20  age cache spill 
62a0: 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64  size. The second
62b0: 20 66 6f 72 6d 20 74 75 72 6e 73 20 63 61 63 68   form turns cach
62c0: 65 20 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20  e spill on.  ** 
62d0: 6f 72 20 6f 66 66 2e 20 20 57 68 65 6e 20 74 75  or off.  When tu
62e0: 72 6e 6e 69 6e 67 20 63 61 63 68 65 20 73 70 69  rnning cache spi
62f0: 6c 6c 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20  ll on, the size 
6300: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
6310: 2a 2a 20 63 75 72 72 65 6e 74 20 63 61 63 68 65  ** current cache
6320: 5f 73 69 7a 65 2e 20 20 54 68 65 20 74 68 69 72  _size.  The thir
6330: 64 20 66 6f 72 6d 20 73 65 74 73 20 61 20 73 70  d form sets a sp
6340: 69 6c 6c 20 73 69 7a 65 20 74 68 61 74 0a 20 20  ill size that.  
6350: 2a 2a 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ** may be differ
6360: 65 6e 74 20 66 6f 72 6d 20 74 68 65 20 63 61 63  ent form the cac
6370: 68 65 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66  he size..  ** If
6380: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6390: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
63a0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
63b0: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
63c0: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
63d0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
63e0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
63f0: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
6400: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
6410: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
6420: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
6430: 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ry..  **.  ** If
6440: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6450: 61 63 68 65 5f 73 70 69 6c 6c 20 70 61 67 65 73  ache_spill pages
6460: 20 69 73 20 6c 65 73 73 20 74 68 65 6e 20 74 68   is less then th
6470: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
6480: 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61 67 65   cache_size page
6490: 73 2c 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f  s, no spilling o
64a0: 63 63 75 72 73 20 75 6e 74 69 6c 20 74 68 65 20  ccurs until the 
64b0: 70 61 67 65 20 63 6f 75 6e 74 20 65 78 63 65 65  page count excee
64c0: 64 73 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  ds.  ** the numb
64d0: 65 72 20 6f 66 20 63 61 63 68 65 5f 73 69 7a 65  er of cache_size
64e0: 20 70 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a   pages..  **.  *
64f0: 2a 20 54 68 65 20 63 61 63 68 65 5f 73 70 69 6c  * The cache_spil
6500: 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e  l=BOOLEAN settin
6510: 67 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c  g applies to all
6520: 20 61 74 74 61 63 68 65 64 20 73 63 68 65 6d 61   attached schema
6530: 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74  s,.  ** not just
6540: 20 74 68 65 20 73 63 68 65 6d 61 20 73 70 65 63   the schema spec
6550: 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ified..  */.  ca
6560: 73 65 20 50 72 61 67 54 79 70 5f 43 41 43 48 45  se PragTyp_CACHE
6570: 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73  _SPILL: {.    as
6580: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
6590: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
65a0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
65b0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
65c0: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
65d0: 65 49 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20  eInt(v,.        
65e0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
65f0: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 29  LITE_CacheSpill)
6600: 3d 3d 30 20 3f 20 30 20 3a 20 0a 20 20 20 20 20  ==0 ? 0 : .     
6610: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6620: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
6630: 70 44 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20  pDb->pBt,0));.  
6640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6650: 6e 74 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20  nt size = 1;.   
6660: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
6670: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
6680: 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  size) ){.       
6690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
66a0: 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70  SpillSize(pDb->p
66b0: 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20  Bt, size);.     
66c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
66d0: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
66e0: 52 69 67 68 74 2c 20 73 69 7a 65 21 3d 30 29 20  Right, size!=0) 
66f0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66  ){.        db->f
6700: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43  lags |= SQLITE_C
6710: 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20  acheSpill;.     
6720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6730: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
6740: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6760: 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28  etAllPagerFlags(
6770: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  db);.    }.    b
6780: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6790: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
67a0: 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28  hema.]mmap_size(
67b0: 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  N).  **.  ** Use
67c0: 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69 6e 67  d to set mapping
67d0: 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54 68 65   size limit. The
67e0: 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69   mapping size li
67f0: 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73 65 64  mit is.  ** used
6800: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 61 67   to limit the ag
6810: 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f 66 20  gregate size of 
6820: 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  all memory mappe
6830: 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74 68 65  d regions of the
6840: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
6850: 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70 61 72  ile. If this par
6860: 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
6870: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f   zero, then memo
6880: 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a 2a 20  ry mapping.  ** 
6890: 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74 20 61  is not used at a
68a0: 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67  ll.  If N is neg
68b0: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
68c0: 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 6d  default memory m
68d0: 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 64 65  ap.  ** limit de
68e0: 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71 6c 69  termined by sqli
68f0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
6900: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
6910: 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a  ZE) is set..  **
6920: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 4e   The parameter N
6930: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
6940: 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  bytes..  **.  **
6950: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   This value is a
6960: 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20 75 6e  dvisory.  The un
6970: 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69 73 20  derlying VFS is 
6980: 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79 20 6d  free to memory m
6990: 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74 74 6c  ap.  ** as littl
69a0: 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61 73 20  e or as much as 
69b0: 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63 65 70  it wants.  Excep
69c0: 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74 20 74  t, if N is set t
69d0: 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  o 0 then the.  *
69e0: 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73 20 77  * upper layers w
69f0: 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65  ill never invoke
6a00: 20 74 68 65 20 78 46 65 74 63 68 20 69 6e 74 65   the xFetch inte
6a10: 72 66 61 63 65 73 20 74 6f 20 74 68 65 20 56 46  rfaces to the VF
6a20: 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  S..  */.  case P
6a30: 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49 5a 45  ragTyp_MMAP_SIZE
6a40: 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
6a50: 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20 53 51  int64 sz;.#if SQ
6a60: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
6a70: 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72 74 28  ZE>0.    assert(
6a80: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
6a90: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
6aa0: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a   0) );.    if( z
6ab0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
6ac0: 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73 71 6c  nt ii;.      sql
6ad0: 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
6ae0: 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29 3b 0a  4(zRight, &sz);.
6af0: 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30 20 29        if( sz<0 )
6b00: 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f   sz = sqlite3Glo
6b10: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
6b20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32  ;.      if( pId2
6b30: 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73 7a 4d  ->n==0 ) db->szM
6b40: 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  map = sz;.      
6b50: 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d 31  for(ii=db->nDb-1
6b60: 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a  ; ii>=0; ii--){.
6b70: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
6b80: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
6b90: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
6ba0: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6bc0: 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64 62 2d  SetMmapLimit(db-
6bd0: 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 73 7a  >aDb[ii].pBt, sz
6be0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6bf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
6c00: 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63 20 3d  z = -1;.    rc =
6c10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
6c20: 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53  ntrol(db, zDb, S
6c30: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
6c40: 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23 65 6c  _SIZE, &sz);.#el
6c50: 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  se.    sz = 0;. 
6c60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6c70: 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  K;.#endif.    if
6c80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6c90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
6ca0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 7a 29 3b  ingleInt(v, sz);
6cb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
6cc0: 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c!=SQLITE_NOTFOU
6cd0: 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ND ){.      pPar
6ce0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
6cf0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
6d00: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  c;.    }.    bre
6d10: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6d20: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
6d30: 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20 20 50 52  _store.  **   PR
6d40: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
6d50: 3d 20 22 64 65 66 61 75 6c 74 22 7c 22 6d 65 6d  = "default"|"mem
6d60: 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20 20 2a 2a  ory"|"file".  **
6d70: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
6d80: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
6d90: 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f  lue of the temp_
6da0: 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 43 68 61  store flag.  Cha
6db0: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c  nging.  ** the l
6dc0: 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20  ocal value does 
6dd0: 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73  not make changes
6de0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c   to the disk fil
6df0: 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c  e and the defaul
6e00: 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77 69 6c  t.  ** value wil
6e10: 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68  l be restored th
6e20: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
6e30: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
6e40: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ed..  **.  ** No
6e50: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 70 6f  te that it is po
6e60: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 6c  ssible for the l
6e70: 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65 2d 74  ibrary compile-t
6e80: 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f 0a 20  ime options to. 
6e90: 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74 68 69   ** override thi
6ea0: 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  s setting.  */. 
6eb0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 45   case PragTyp_TE
6ec0: 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  MP_STORE: {.    
6ed0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
6ee0: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
6ef0: 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74 65 6d 70  eInt(v, db->temp
6f00: 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20 7d 65 6c  _store);.    }el
6f10: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  se{.      change
6f20: 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50 61 72  TempStorage(pPar
6f30: 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  se, zRight);.   
6f40: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
6f50: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
6f60: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
6f70: 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20  _directory.  ** 
6f80: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
6f90: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
6fa0: 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61  ""|"directory_na
6fb0: 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  me".  **.  ** Re
6fc0: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
6fd0: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
6fe0: 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  he temp_store_di
6ff0: 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43  rectory flag.  C
7000: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7010: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
7020: 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79  ecific directory
7030: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7040: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
7050: 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 74 6f  .  ** Setting to
7060: 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72   a null string r
7070: 65 76 65 72 74 73 20 74 6f 20 74 68 65 20 64 65  everts to the de
7080: 66 61 75 6c 74 20 74 65 6d 70 6f 72 61 72 79 20  fault temporary 
7090: 64 69 72 65 63 74 6f 72 79 20 73 65 61 72 63 68  directory search
70a0: 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d 70 6f 72  ..  ** If tempor
70b0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 69 73  ary directory is
70c0: 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 69   changed, then i
70d0: 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f  nvalidateTempSto
70e0: 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rage..  **.  */.
70f0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54    case PragTyp_T
7100: 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52 45 43 54  EMP_STORE_DIRECT
7110: 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ORY: {.    if( !
7120: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7130: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
7140: 28 76 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  (v, sqlite3_temp
7150: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
7160: 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
7170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
7180: 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74        if( zRight
7190: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  [0] ){.        i
71a0: 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
71b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
71c0: 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a  cess(db->pVfs, z
71d0: 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43  Right, SQLITE_AC
71e0: 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20  CESS_READWRITE, 
71f0: 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
7200: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7210: 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20   || res==0 ){.  
7220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7230: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7240: 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20  "not a writable 
7250: 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20  directory");.   
7260: 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67         goto prag
7270: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ma_out;.        
7280: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7290: 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  if( SQLITE_TEMP_
72a0: 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20 20 20  STORE==0.       
72b0: 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  || (SQLITE_TEMP_
72c0: 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62 2d 3e  STORE==1 && db->
72d0: 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29 0a 20  temp_store<=1). 
72e0: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
72f0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 20 26  _TEMP_STORE==2 &
7300: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
7310: 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ==1).      ){.  
7320: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
7330: 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50 61 72  TempStorage(pPar
7340: 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
7350: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7360: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
7370: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69  ectory);.      i
7380: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
73a0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
73b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
73c0: 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a  ("%s", zRight);.
73d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
73e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d       sqlite3_tem
73f0: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
7400: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
7410: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
7420: 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  SD */.    }.    
7430: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20  break;.  }..#if 
7440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
7450: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
7460: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
7470: 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41  ctory.  **   PRA
7480: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
7490: 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64  irectory = ""|"d
74a0: 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20  irectory_name". 
74b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
74c0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
74d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
74e0: 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
74f0: 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  ry flag.  Changi
7500: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  ng.  ** the valu
7510: 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69  e sets a specifi
7520: 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62  c directory to b
7530: 65 20 75 73 65 64 20 66 6f 72 20 64 61 74 61 62  e used for datab
7540: 61 73 65 20 66 69 6c 65 73 20 74 68 61 74 0a 20  ase files that. 
7550: 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69 66 69   ** were specifi
7560: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
7570: 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 53 65  ve pathname.  Se
7580: 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20  tting to a null 
7590: 73 74 72 69 6e 67 20 72 65 76 65 72 74 73 0a 20  string reverts. 
75a0: 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66 61 75   ** to the defau
75b0: 6c 74 20 64 61 74 61 62 61 73 65 20 64 69 72 65  lt database dire
75c0: 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66 6f 72  ctory, which for
75d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
75e0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 0a 20  specified with. 
75f0: 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65 20 70   ** a relative p
7600: 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ath will probabl
7610: 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  y be based on th
7620: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74  e current direct
7630: 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ory for the.  **
7640: 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74 61 62   process.  Datab
7650: 61 73 65 20 66 69 6c 65 20 73 70 65 63 69 66 69  ase file specifi
7660: 65 64 20 77 69 74 68 20 61 6e 20 61 62 73 6f 6c  ed with an absol
7670: 75 74 65 20 70 61 74 68 20 61 72 65 20 6e 6f 74  ute path are not
7680: 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a 20 62   impacted.  ** b
7690: 79 20 74 68 69 73 20 73 65 74 74 69 6e 67 2c 20  y this setting, 
76a0: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 69 74  regardless of it
76b0: 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20  s value..  **.  
76c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
76d0: 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44 49 52  p_DATA_STORE_DIR
76e0: 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66  ECTORY: {.    if
76f0: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7700: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
7710: 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 64  ext(v, sqlite3_d
7720: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  ata_directory);.
7730: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
7740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
7750: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
7760: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7770: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7790: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
77a0: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
77b0: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
77c0: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
77d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
77e0: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
77f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7800: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7810: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
7820: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
7830: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
7840: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
7850: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7860: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7870: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
7880: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69  ectory);.      i
7890: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
78a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
78b0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
78c0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
78d0: 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a  ("%s", zRight);.
78e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
78f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
7900: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
7910: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
7920: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
7930: 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  SD */.    }.    
7940: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
7950: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  f..#if SQLITE_EN
7960: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
7970: 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  LE.  /*.  **   P
7980: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c  RAGMA [schema.]l
7990: 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 20  ock_proxy_file. 
79a0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
79b0: 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  hema.]lock_proxy
79c0: 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f 3a 22  _file = ":auto:"
79d0: 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61 74 68  |"lock_file_path
79e0: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
79f0: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 76 61  rn or set the va
7a00: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 5f  lue of the lock_
7a10: 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61 67 2e  proxy_file flag.
7a20: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7a30: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
7a40: 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 20 74   specific file t
7a50: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
7a60: 74 61 62 61 73 65 20 61 63 63 65 73 73 20 6c 6f  tabase access lo
7a70: 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  cks..  **.  */. 
7a80: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f   case PragTyp_LO
7a90: 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a 20 7b  CK_PROXY_FILE: {
7aa0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
7ab0: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
7ac0: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
7ad0: 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d  3BtreePager(pDb-
7ae0: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 63 68 61  >pBt);.      cha
7af0: 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61  r *proxy_file_pa
7b00: 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  th = NULL;.     
7b10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
7b20: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
7b30: 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
7b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
7b50: 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
7b60: 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 47 45  pFile, SQLITE_GE
7b70: 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
7b80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 72               &pr
7ba0: 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a  oxy_file_path);.
7bb0: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7bc0: 6c 65 54 65 78 74 28 76 2c 20 70 72 6f 78 79 5f  leText(v, proxy_
7bd0: 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20  file_path);.    
7be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61 67  }else{.      Pag
7bf0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7c00: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7c10: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7c20: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
7c30: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
7c40: 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
7c50: 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
7c60: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7c70: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0] ){.        re
7c80: 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  s=sqlite3OsFileC
7c90: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
7ca0: 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
7cb0: 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20  XYFILE, .       
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52                zR
7ce0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 20 65  ight);.      } e
7cf0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 72 65  lse {.        re
7d00: 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  s=sqlite3OsFileC
7d10: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
7d20: 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
7d30: 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20  XYFILE, .       
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
7d60: 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
7d70: 20 20 20 69 66 28 20 72 65 73 21 3d 53 51 4c 49     if( res!=SQLI
7d80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
7d90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7da0: 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c 65 64  (pParse, "failed
7db0: 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70 72 6f   to set lock pro
7dc0: 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  xy file");.     
7dd0: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
7de0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
7df0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7e00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7e10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
7e20: 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20 20 0a  _STYLE */      .
7e30: 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20      .  /*.  **  
7e40: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7e50: 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a  ]synchronous.  *
7e60: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
7e70: 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ma.]synchronous=
7e80: 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55  OFF|ON|NORMAL|FU
7e90: 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a 0a 20 20  LL|EXTRA.  **.  
7ea0: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
7eb0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7ec0: 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e   of the synchron
7ed0: 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ous flag.  Chang
7ee0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63  ing.  ** the loc
7ef0: 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f  al value does no
7f00: 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74  t make changes t
7f10: 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  o the disk file 
7f20: 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66  and the.  ** def
7f30: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
7f40: 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65 20  be restored the 
7f50: 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64 61  next time the da
7f60: 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f  tabase is.  ** o
7f70: 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  pened..  */.  ca
7f80: 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e 43 48  se PragTyp_SYNCH
7f90: 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20 69 66  RONOUS: {.    if
7fa0: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7fb0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
7fc0: 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61 66 65 74  nt(v, pDb->safet
7fd0: 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20 20 20 20  y_level-1);.    
7fe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
7ff0: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
8000: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8010: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8020: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
8030: 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c 20 6d   "Safety level m
8040: 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ay not be change
8050: 64 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73  d inside a trans
8060: 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  action");.      
8070: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
8080: 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74  nt iLevel = (get
8090: 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67  SafetyLevel(zRig
80a0: 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47  ht,0,1)+1) & PAG
80b0: 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
80c0: 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ASK;.        if(
80d0: 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65   iLevel==0 ) iLe
80e0: 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  vel = 1;.       
80f0: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
8100: 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20  el = iLevel;.   
8110: 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53       pDb->bSyncS
8120: 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
8130: 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73  setAllPagerFlags
8140: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
8150: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8160: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8170: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
8180: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
8190: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
81a0: 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61  LAG_PRAGMAS.  ca
81b0: 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a  se PragTyp_FLAG:
81c0: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
81d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65  t==0 ){.      se
81e0: 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c  tPragmaResultCol
81f0: 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61  umnNames(v, pPra
8200: 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gma);.      retu
8210: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28  rnSingleInt(v, (
8220: 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61  db->flags & pPra
8230: 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b  gma->iArg)!=0 );
8240: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8250: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72    int mask = pPr
8260: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f  agma->iArg;    /
8270: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
8280: 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20  o set or clear. 
8290: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  */.      if( db-
82a0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
82b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
82c0: 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74  eign key support
82d0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62   may not be enab
82e0: 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20  led or disabled 
82f0: 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20  while not.      
8300: 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d    ** in auto-com
8310: 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  mit mode.  */.  
8320: 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28        mask &= ~(
8330: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
8340: 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ys);.      }.#if
8350: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
8360: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
8370: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
8380: 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f  uthLevel==UAUTH_
8390: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
83a0: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
83b0: 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20  non-admin users 
83c0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63  to modify the sc
83d0: 68 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79  hema arbitrarily
83e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b   */.        mask
83f0: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69   &= ~(SQLITE_Wri
8400: 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  teSchema);.     
8410: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
8420: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42   if( sqlite3GetB
8430: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
8440: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
8450: 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  >flags |= mask;.
8460: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8470: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
8480: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = ~mask;.       
8490: 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54   if( mask==SQLIT
84a0: 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d  E_DeferFKs ) db-
84b0: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
84c0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  s = 0;.      }..
84d0: 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66        /* Many of
84e0: 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61   the flag-pragma
84f0: 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64  s modify the cod
8500: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
8510: 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a  he SQL .      **
8520: 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63   compiler (eg. c
8530: 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53  ount_changes). S
8540: 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  o add an opcode 
8550: 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20  to expire all.  
8560: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
8570: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
8580: 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  fter modifying a
8590: 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20   pragma value.. 
85a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
85b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
85c0: 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
85d0: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
85e0: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
85f0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8600: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8610: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
8620: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
8630: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
8640: 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  A_PRAGMAS.  /*. 
8650: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62   **   PRAGMA tab
8660: 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29  le_info(<table>)
8670: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
8680: 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66  n a single row f
8690: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
86a0: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
86b0: 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  e. The columns o
86c0: 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72  f.  ** the retur
86d0: 6e 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65  ned data set are
86e0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a  :.  **.  ** cid:
86f0: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69          Column i
8700: 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d  d (numbered from
8710: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
8720: 73 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20  starting at 0). 
8730: 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20   ** name:       
8740: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a  Column name.  **
8750: 20 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c   type:       Col
8760: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  umn declaration 
8770: 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75  type..  ** notnu
8780: 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27  ll:    True if '
8790: 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72  NOT NULL' is par
87a0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  t of column decl
87b0: 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c  aration.  ** dfl
87c0: 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66  t_value: The def
87d0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
87e0: 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e  he column, if an
87f0: 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  y..  */.  case P
8800: 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46  ragTyp_TABLE_INF
8810: 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  O: if( zRight ){
8820: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8830: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
8840: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
8850: 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e  pParse, LOCATE_N
8860: 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44  OERR, zRight, zD
8870: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
8880: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
8890: 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48   k;.      int nH
88a0: 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  idden = 0;.     
88b0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
88c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
88d0: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
88e0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
88f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
8900: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 73 71  em = 6;.      sq
8910: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
8920: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
8930: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
8940: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
8950: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
8960: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
8970: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
8980: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
8990: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
89a0: 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
89b0: 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20  denColumn(pCol) 
89c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69  ){.          nHi
89d0: 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dden++;.        
89e0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
89f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8a00: 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  ( (pCol->colFlag
8a10: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
8a20: 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  KEY)==0 ){.     
8a30: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
8a40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
8a50: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
8a60: 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20    k = 1;.       
8a70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8a80: 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54    for(k=1; k<=pT
8a90: 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d  ab->nCol && pPk-
8aa0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d  >aiColumn[k-1]!=
8ab0: 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  i; k++){}.      
8ac0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
8ad0: 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d  rt( pCol->pDflt=
8ae0: 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c  =0 || pCol->pDfl
8af0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29  t->op==TK_SPAN )
8b00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8b10: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
8b20: 2c 20 31 2c 20 22 69 73 73 69 73 69 22 2c 0a 20  , 1, "issisi",. 
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2d                i-
8b40: 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20  nHidden,.       
8b50: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
8b60: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8b70: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
8b80: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a  nType(pCol,""),.
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
8ba0: 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31  Col->notNull ? 1
8bb0: 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20   : 0,.          
8bc0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
8bd0: 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e   ? pCol->pDflt->
8be0: 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20  u.zToken : 0,.  
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 29 3b               k);
8c00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8c10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8c20: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 36  _ResultRow, 1, 6
8c30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8c40: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
8c50: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 54   case PragTyp_ST
8c60: 41 54 53 3a 20 7b 0a 20 20 20 20 49 6e 64 65 78  ATS: {.    Index
8c70: 20 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73 68   *pIdx;.    Hash
8c80: 45 6c 65 6d 20 2a 69 3b 0a 20 20 20 20 70 50 61  Elem *i;.    pPa
8c90: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 34 3b 0a 20  rse->nMem = 4;. 
8ca0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
8cb0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
8cc0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 66 6f 72  e, iDb);.    for
8cd0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
8ce0: 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
8cf0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ->tblHash); i; i
8d00: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8d10: 69 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  i)){.      Table
8d20: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
8d30: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
8d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
8d50: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73  tiLoad(v, 1, "ss
8d60: 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ii",.           
8d70: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
8d80: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
8d90: 20 20 20 20 20 20 70 54 61 62 2d 3e 73 7a 54 61        pTab->szTa
8da0: 62 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  bRow,.          
8db0: 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
8dc0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8dd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8de0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
8df0: 34 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  4);.      for(pI
8e00: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
8e10: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
8e20: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
8e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
8e40: 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73 69  tiLoad(v, 2, "si
8e50: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  i",.           p
8e60: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Idx->zName,.    
8e70: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 73 7a 49         pIdx->szI
8e80: 64 78 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  dxRow,.         
8e90: 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67    pIdx->aiRowLog
8ea0: 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Est[0]);.       
8eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ec0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
8ed0: 6f 77 2c 20 31 2c 20 34 29 3b 0a 20 20 20 20 20  ow, 1, 4);.     
8ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
8ef0: 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72  reak;..  case Pr
8f00: 61 67 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46 4f  agTyp_INDEX_INFO
8f10: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
8f20: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
8f30: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8f40: 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c  ;.    pIdx = sql
8f50: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
8f60: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
8f70: 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
8f80: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
8f90: 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20     int mx;.     
8fa0: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
8fb0: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rg ){.        /*
8fc0: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69   PRAGMA index_xi
8fd0: 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69  nfo (newer versi
8fe0: 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77  on with more row
8ff0: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a  s and columns) *
9000: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
9010: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
9020: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9030: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65  em = 6;.      }e
9040: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9050: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66  PRAGMA index_inf
9060: 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f  o (legacy versio
9070: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  n) */.        mx
9080: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
9090: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
90a0: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
90b0: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d    }.      pTab =
90c0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
90d0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
90e0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
90f0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9100: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
9110: 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e  >nMem<=pPragma->
9120: 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20 20  nPragCName );.  
9130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d      for(i=0; i<m
9140: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
9150: 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49 64 78   i16 cnum = pIdx
9160: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
9170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9180: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9190: 2c 20 22 69 69 73 22 2c 20 69 2c 20 63 6e 75 6d  , "iis", i, cnum
91a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
91c0: 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54 61 62  num<0 ? 0 : pTab
91d0: 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61  ->aCol[cnum].zNa
91e0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
91f0: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29   pPragma->iArg )
9200: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9210: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9220: 28 76 2c 20 34 2c 20 22 69 73 69 22 2c 0a 20 20  (v, 4, "isi",.  
9230: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9240: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2c 0a 20  aSortOrder[i],. 
9250: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9260: 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20  >azColl[i],.    
9270: 20 20 20 20 20 20 20 20 69 3c 70 49 64 78 2d 3e          i<pIdx->
9280: 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20  nKeyCol);.      
9290: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
92a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
92b0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
92c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  , pParse->nMem);
92d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
92e0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63   }.  break;..  c
92f0: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9300: 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67  X_LIST: if( zRig
9310: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
9320: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
9330: 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20   *pTab;.    int 
9340: 69 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  i;.    pTab = sq
9350: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
9360: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
9370: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
9380: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
9390: 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20 73  Mem = 5;.      s
93a0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
93b0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
93c0: 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  Db);.      for(p
93d0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
93e0: 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20 70 49 64  , i=0; pIdx; pId
93f0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69  x=pIdx->pNext, i
9400: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
9410: 73 74 20 63 68 61 72 20 2a 61 7a 4f 72 69 67 69  st char *azOrigi
9420: 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20 22 75 22  n[] = { "c", "u"
9430: 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20 20 20 20  , "pk" };.      
9440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9450: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73  tiLoad(v, 1, "is
9460: 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20  isi",.          
9470: 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   i,.           p
9480: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Idx->zName,.    
9490: 20 20 20 20 20 20 20 49 73 55 6e 69 71 75 65 49         IsUniqueI
94a0: 6e 64 65 78 28 70 49 64 78 29 2c 0a 20 20 20 20  ndex(pIdx),.    
94b0: 20 20 20 20 20 20 20 61 7a 4f 72 69 67 69 6e 5b         azOrigin[
94c0: 70 49 64 78 2d 3e 69 64 78 54 79 70 65 5d 2c 0a  pIdx->idxType],.
94d0: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
94e0: 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
94f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
9500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9510: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
9520: 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 5);.      }.  
9530: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9540: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9550: 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a 20  _DATABASE_LIST: 
9560: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9570: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9580: 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  3;.    for(i=0; 
9590: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
95a0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
95b0: 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63  Db[i].pBt==0 ) c
95c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
95d0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
95e0: 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29 3b  ].zDbSName!=0 );
95f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9600: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9610: 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20 20  , "iss",.       
9620: 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64 62    i,.         db
9630: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
9640: 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  e,.         sqli
9650: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
9660: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ame(db->aDb[i].p
9670: 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Bt));.      sqli
9680: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9690: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
96a0: 2c 20 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 3);.    }.  }.
96b0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
96c0: 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54 49   PragTyp_COLLATI
96d0: 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69  ON_LIST: {.    i
96e0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48 61  nt i = 0;.    Ha
96f0: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 70  shElem *p;.    p
9700: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b  Parse->nMem = 2;
9710: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
9720: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9730: 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d  aCollSeq); p; p=
9740: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
9750: 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  )){.      CollSe
9760: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
9770: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
9780: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 73  Data(p);.      s
9790: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
97a0: 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c 20  oad(v, 1, "is", 
97b0: 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  i++, pColl->zNam
97c0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
97d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
97e0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
97f0: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2);.    }.  }.  
9800: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
9810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
9820: 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  EMA_PRAGMAS */..
9830: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9840: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
9850: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
9860: 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a  OREIGN_KEY_LIST:
9870: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
9880: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20     FKey *pFK;.  
9890: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
98a0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
98b0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
98c0: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
98d0: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
98e0: 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70     pFK = pTab->p
98f0: 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20  FKey;.      if( 
9900: 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pFK ){.        i
9910: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
9920: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9930: 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 8;.        sql
9940: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
9950: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
9960: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
9970: 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20 20 20  (pFK){.         
9980: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
9990: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b    for(j=0; j<pFK
99a0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
99b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
99c0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
99d0: 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73 22 2c  , 1, "iissssss",
99e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
99f0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9a00: 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20 20 20            j,.   
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20 20  pFK->zTo,.      
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
9a40: 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f  b->aCol[pFK->aCo
9a50: 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d  l[j].iFrom].zNam
9a60: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
9a70: 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b        pFK->aCol[
9a80: 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20 20  j].zCol,.       
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69              acti
9aa0: 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74  onName(pFK->aAct
9ab0: 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20  ion[1]),  /* ON 
9ac0: 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 20 20  UPDATE */.      
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74               act
9ae0: 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63  ionName(pFK->aAc
9af0: 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e  tion[0]),  /* ON
9b00: 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 20   DELETE */.     
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
9b20: 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ONE");.         
9b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9b40: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9b50: 74 52 6f 77 2c 20 31 2c 20 38 29 3b 0a 20 20 20  tRow, 1, 8);.   
9b60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9b70: 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20     ++i;.        
9b80: 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65    pFK = pFK->pNe
9b90: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20  xtFrom;.        
9ba0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
9bb0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9bc0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
9bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
9be0: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66  IGN_KEY) */..#if
9bf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9c00: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 23 69 66  _FOREIGN_KEY.#if
9c10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9c20: 5f 54 52 49 47 47 45 52 0a 20 20 63 61 73 65 20  _TRIGGER.  case 
9c30: 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f  PragTyp_FOREIGN_
9c40: 4b 45 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20  KEY_CHECK: {.   
9c50: 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20 20 20 20   FKey *pFK;     
9c60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 6f 72          /* A for
9c70: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
9c80: 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  int */.    Table
9c90: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
9ca0: 20 20 2f 2a 20 43 68 69 6c 64 20 74 61 62 6c 65    /* Child table
9cb0: 20 63 6f 6e 74 61 69 6e 20 22 52 45 46 45 52 45   contain "REFERE
9cc0: 4e 43 45 53 22 20 6b 65 79 77 6f 72 64 20 2a 2f  NCES" keyword */
9cd0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 50 61 72  .    Table *pPar
9ce0: 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  ent;        /* P
9cf0: 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  arent table that
9d00: 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 74 6f   child points to
9d10: 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
9d20: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
9d30: 2a 20 49 6e 64 65 78 20 69 6e 20 74 68 65 20 70  * Index in the p
9d40: 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  arent table */. 
9d50: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
9d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9d70: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 6f 72 65  p counter:  Fore
9d80: 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65 72 20 66  ign key number f
9d90: 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69  or pTab */.    i
9da0: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
9db0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9dc0: 75 6e 74 65 72 3a 20 20 46 69 65 6c 64 20 6f 66  unter:  Field of
9dd0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
9de0: 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   */.    HashElem
9df0: 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f   *k;           /
9e00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20  * Loop counter: 
9e10: 20 4e 65 78 74 20 74 61 62 6c 65 20 69 6e 20 73   Next table in s
9e20: 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74  chema */.    int
9e30: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
9e40: 20 20 20 20 2f 2a 20 72 65 73 75 6c 74 20 76 61      /* result va
9e50: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
9e60: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
9e70: 20 20 20 20 20 2f 2a 20 33 20 72 65 67 69 73 74       /* 3 regist
9e80: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 65  ers to hold a re
9e90: 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
9ea0: 69 6e 74 20 72 65 67 4b 65 79 3b 20 20 20 20 20  int regKey;     
9eb0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
9ec0: 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65 79 20 66  er to hold key f
9ed0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  or checking the 
9ee0: 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  FK */.    int re
9ef0: 67 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  gRow;           
9f00: 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
9f10: 20 68 6f 6c 64 20 61 20 72 6f 77 20 66 72 6f 6d   hold a row from
9f20: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74   pTab */.    int
9f30: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
9f40: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 61 20      /* Top of a 
9f50: 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67 20 66 6f  loop checking fo
9f60: 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f 0a 20 20  reign keys */.  
9f70: 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b 20 20 20    int addrOk;   
9f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
9f90: 20 68 65 72 65 20 69 66 20 74 68 65 20 6b 65 79   here if the key
9fa0: 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e   is OK */.    in
9fb0: 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20 20 20 20  t *aiCols;      
9fc0: 20 20 20 20 20 2f 2a 20 63 68 69 6c 64 20 74 6f       /* child to
9fd0: 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d   parent column m
9fe0: 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  apping */..    r
9ff0: 65 67 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73  egResult = pPars
a000: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
a010: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34  Parse->nMem += 4
a020: 3b 0a 20 20 20 20 72 65 67 4b 65 79 20 3d 20 2b  ;.    regKey = +
a030: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a040: 20 20 20 72 65 67 52 6f 77 20 3d 20 2b 2b 70 50     regRow = ++pP
a050: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a060: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
a070: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
a080: 69 44 62 29 3b 0a 20 20 20 20 6b 20 3d 20 73 71  iDb);.    k = sq
a090: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
a0a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
a0b0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 0a 20  ema->tblHash);. 
a0c0: 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b 0a 20     while( k ){. 
a0d0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20       if( zRight 
a0e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
a0f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
a100: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
a110: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
a120: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
a130: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a140: 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
a150: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
a160: 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  k);.        k = 
a170: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
a180: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a190: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
a1a0: 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d 30 20 29  pTab->pFKey==0 )
a1b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a1c0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
a1d0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
a1e0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
a1f0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a200: 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c    if( pTab->nCol
a210: 2b 72 65 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e  +regRow>pParse->
a220: 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e  nMem ) pParse->n
a230: 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Mem = pTab->nCol
a240: 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20 20 20 20   + regRow;.     
a250: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
a260: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  e(pParse, 0, iDb
a270: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
a280: 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ead);.      sqli
a290: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
a2a0: 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  g(v, regResult, 
a2b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
a2c0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
a2d0: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
a2e0: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
a2f0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
a300: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
a310: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
a320: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
a330: 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
a340: 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f 6e  pParent==0 ) con
a350: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
a360: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
a370: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
a380: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
a390: 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c  Parent->tnum, 0,
a3a0: 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29   pParent->zName)
a3b0: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 73 71  ;.        x = sq
a3c0: 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64  lite3FkLocateInd
a3d0: 65 78 28 70 50 61 72 73 65 2c 20 70 50 61 72 65  ex(pParse, pPare
a3e0: 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c 20  nt, pFK, &pIdx, 
a3f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a400: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
a410: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
a420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a430: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
a440: 61 72 73 65 2c 20 69 2c 20 69 44 62 2c 20 70 50  arse, i, iDb, pP
a450: 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65  arent, OP_OpenRe
a460: 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ad);.          }
a470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a490: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
a4a0: 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75  ad, i, pIdx->tnu
a4b0: 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
a4c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a4d0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
a4e0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
a4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a500: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a510: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
a520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a530: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a540: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
a550: 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d  >nErr>0 || pFK==
a560: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
a570: 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  FK ) break;.    
a580: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
a590: 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d 3e 6e  ab<i ) pParse->n
a5a0: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 61  Tab = i;.      a
a5b0: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
a5c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
a5d0: 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56 64 62  _Rewind, 0); Vdb
a5e0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a5f0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
a600: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
a610: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
a620: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
a630: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
a640: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
a650: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
a660: 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  b);.        pIdx
a670: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 69   = 0;.        ai
a680: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cols = 0;.      
a690: 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
a6a0: 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
a6b0: 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e  qlite3FkLocateIn
a6c0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 50 61 72  dex(pParse, pPar
a6d0: 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c  ent, pFK, &pIdx,
a6e0: 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20   &aiCols);.     
a6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d       assert( x==
a700: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  0 );.        }. 
a710: 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20 3d 20         addrOk = 
a720: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
a730: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
a740: 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
a750: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
a760: 20 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20       int iKey = 
a770: 70 46 4b 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  pFK->aCol[0].iFr
a780: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  om;.          as
a790: 73 65 72 74 28 20 69 4b 65 79 3e 3d 30 20 26 26  sert( iKey>=0 &&
a7a0: 20 69 4b 65 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iKey<pTab->nCol
a7b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
a7c0: 28 20 69 4b 65 79 21 3d 70 54 61 62 2d 3e 69 50  ( iKey!=pTab->iP
a7d0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
a7e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a7f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
a800: 6e 2c 20 30 2c 20 69 4b 65 79 2c 20 72 65 67 52  n, 0, iKey, regR
a810: 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ow);.           
a820: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
a830: 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
a840: 4b 65 79 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  Key, regRow);.  
a850: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a860: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a870: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  P_IsNull, regRow
a880: 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43  , addrOk); VdbeC
a890: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a8a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a8b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a8c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a8d0: 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 6f  _Rowid, 0, regRo
a8e0: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  w);.          }.
a8f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a900: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a910: 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 2c 20  P_SeekRowid, i, 
a920: 30 2c 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65  0, regRow); Vdbe
a930: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a950: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b  beGoto(v, addrOk
a960: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
a970: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a980: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
a990: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
a9a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a9b0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
a9c0: 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b  =0; j<pFK->nCol;
a9d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
a9e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a9f0: 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
aa00: 6c 65 28 76 2c 20 70 54 61 62 2c 20 30 2c 0a 20  le(v, pTab, 0,. 
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 20 20 20 20 20 61 69 43 6f 6c             aiCol
aa30: 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20  s ? aiCols[j] : 
aa40: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
aa50: 6f 6d 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20  om, regRow+j);. 
aa60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
aa70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
aa80: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f  OP_IsNull, regRo
aa90: 77 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64  w+j, addrOk); Vd
aaa0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
aab0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aac0: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
aad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aaf0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
ab00: 72 64 2c 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d  rd, regRow, pFK-
ab10: 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20  >nCol, regKey,. 
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ab40: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
ab50: 79 53 74 72 28 64 62 2c 70 49 64 78 29 2c 20 70  yStr(db,pIdx), p
ab60: 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  FK->nCol);.     
ab70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ab80: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
ab90: 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64 72  P_Found, i, addr
aba0: 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a  Ok, regKey, 0);.
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
abc0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
abd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
abe0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
abf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ac00: 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  OP_Rowid, 0, reg
ac10: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
ac20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
ac30: 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52 65  ltiLoad(v, regRe
ac40: 73 75 6c 74 2b 32 2c 20 22 73 69 22 2c 20 70 46  sult+2, "si", pF
ac50: 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20 20  K->zTo, i-1);.  
ac60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ac70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
ac80: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
ac90: 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  lt, 4);.        
aca0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
acb0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
acc0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
acd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 69  te3DbFree(db, ai
ace0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cols);.      }. 
acf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ad00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
ad10: 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b 31 29  t, 0, addrTop+1)
ad20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
ad30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ad40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ad50: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d 0a  addrTop);.    }.
ad60: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
ad70: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ad80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
ad90: 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  GER) */.#endif /
ada0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
adb0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
adc0: 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EY) */..#ifndef 
add0: 4e 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72  NDEBUG.  case Pr
ade0: 61 67 54 79 70 5f 50 41 52 53 45 52 5f 54 52 41  agTyp_PARSER_TRA
adf0: 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  CE: {.    if( zR
ae00: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66  ight ){.      if
ae10: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
ae20: 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29  ean(zRight, 0) )
ae30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae40: 33 50 61 72 73 65 72 54 72 61 63 65 28 73 74 64  3ParserTrace(std
ae50: 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29  out, "parser: ")
ae60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ae70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
ae80: 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b  rserTrace(0, 0);
ae90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
aea0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
aeb0: 69 66 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61  if..  /* Reinsta
aec0: 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20  ll the LIKE and 
aed0: 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20  GLOB functions. 
aee0: 20 54 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20   The variant of 
aef0: 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77  LIKE.  ** used w
af00: 69 6c 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73  ill be case sens
af10: 69 74 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70  itive or not dep
af20: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48  ending on the RH
af30: 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  S..  */.  case P
af40: 72 61 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53  ragTyp_CASE_SENS
af50: 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20  ITIVE_LIKE: {.  
af60: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
af70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 67        sqlite3Reg
af80: 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f  isterLikeFunctio
af90: 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65  ns(db, sqlite3Ge
afa0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
afb0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   0));.    }.  }.
afc0: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65    break;..#ifnde
afd0: 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  f SQLITE_INTEGRI
afe0: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
aff0: 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  AX.# define SQLI
b000: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
b010: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30 30  CK_ERROR_MAX 100
b020: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
b030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
b040: 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20 20 2f  EGRITY_CHECK.  /
b050: 2a 20 50 72 61 67 6d 61 20 22 71 75 69 63 6b 5f  * Pragma "quick_
b060: 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63 65  check" is reduce
b070: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  d version of .  
b080: 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  ** integrity_che
b090: 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20 64  ck designed to d
b0a0: 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61 62  etect most datab
b0b0: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20  ase corruption. 
b0c0: 20 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f 73 74   ** without most
b0d0: 20 6f 66 20 74 68 65 20 6f 76 65 72 68 65 61 64   of the overhead
b0e0: 20 6f 66 20 61 20 66 75 6c 6c 20 69 6e 74 65 67   of a full integ
b0f0: 72 69 74 79 2d 63 68 65 63 6b 2e 0a 20 20 2a 2f  rity-check..  */
b100: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
b110: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a  INTEGRITY_CHECK:
b120: 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c   {.    int i, j,
b130: 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20   addr, mxErr;.. 
b140: 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d     int isQuick =
b150: 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72   (sqlite3Tolower
b160: 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29  (zLeft[0])=='q')
b170: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b180: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20   PRAGMA command 
b190: 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  was of the form 
b1a0: 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74  "PRAGMA <db>.int
b1b0: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20  egrity_check",. 
b1c0: 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69     ** then iDb i
b1d0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
b1e0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
b1f0: 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  se identified by
b200: 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e   <db>..    ** In
b210: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
b220: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74  integrity of dat
b230: 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69  abase iDb only i
b240: 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20  s verified by.  
b250: 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72    ** the VDBE cr
b260: 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20  eated below..   
b270: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
b280: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d  wise, if the com
b290: 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20  mand was simply 
b2a0: 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  "PRAGMA integrit
b2b0: 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20  y_check" (or.   
b2c0: 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63   ** "PRAGMA quic
b2d0: 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20  k_check"), then 
b2e0: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e  iDb is set to 0.
b2f0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
b300: 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f  et iDb.    ** to
b310: 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64   -1 here, to ind
b320: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56  icate that the V
b330: 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66  DBE should verif
b340: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a  y the integrity.
b350: 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74      ** of all at
b360: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b370: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
b380: 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ( iDb>=0 );.    
b390: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c  assert( iDb==0 |
b3a0: 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20  | pId2->z );.   
b3b0: 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20   if( pId2->z==0 
b3c0: 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20  ) iDb = -1;..   
b3d0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
b3e0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
b3f0: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
b400: 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a  Mem = 6;..    /*
b410: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
b420: 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a   error count */.
b430: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
b440: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
b450: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
b460: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
b480: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d  Int32(zRight, &m
b490: 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28  xErr);.      if(
b4a0: 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20   mxErr<=0 ){.   
b4b0: 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c       mxErr = SQL
b4c0: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
b4d0: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
b4e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b500: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b510: 2c 20 6d 78 45 72 72 2c 20 31 29 3b 20 20 2f 2a  , mxErr, 1);  /*
b520: 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72   reg[1] holds er
b530: 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20  rors left */..  
b540: 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67    /* Do an integ
b550: 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65 61  rity check on ea
b560: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
b570: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
b580: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
b590: 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d  {.      HashElem
b5a0: 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73 68 20   *x;.      Hash 
b5b0: 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20 69 6e  *pTbls;.      in
b5c0: 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20 20 20 20  t *aRoot;.      
b5d0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
b5e0: 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20 30     int mxIdx = 0
b5f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 78  ;.      int nIdx
b600: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49  ;..      if( OMI
b610: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31  T_TEMPDB && i==1
b620: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
b630: 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26     if( iDb>=0 &&
b640: 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e   i!=iDb ) contin
b650: 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ue;..      sqlit
b660: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
b670: 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ma(pParse, i);. 
b680: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
b690: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b6a0: 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20 2f   OP_IfPos, 1); /
b6b0: 2a 20 48 61 6c 74 20 69 66 20 6f 75 74 20 6f 66  * Halt if out of
b6c0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20   errors */.     
b6d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b6e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b6f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b700: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Halt, 0, 0);.   
b710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b720: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
b730: 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e  ..      /* Do an
b740: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
b750: 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20   of the B-Tree. 
b760: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
b770: 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e   Begin by findin
b780: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73  g the root pages
b790: 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a   numbers.      *
b7a0: 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
b7b0: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20   and indices in 
b7c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
b7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
b7e0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
b7f0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
b800: 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70  i, 0) );.      p
b810: 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Tbls = &db->aDb[
b820: 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  i].pSchema->tblH
b830: 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63  ash;.      for(c
b840: 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61  nt=0, x=sqliteHa
b850: 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20  shFirst(pTbls); 
b860: 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e  x; x=sqliteHashN
b870: 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20  ext(x)){.       
b880: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
b890: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29  qliteHashData(x)
b8a0: 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  ;.        Index 
b8b0: 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  *pIdx;.        i
b8c0: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
b8d0: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
b8e0: 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70     for(nIdx=0, p
b8f0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
b900: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
b910: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
b920: 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20  ){ cnt++; }.    
b930: 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49      if( nIdx>mxI
b940: 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64  dx ) mxIdx = nId
b950: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
b960: 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33   aRoot = sqlite3
b970: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b980: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63  , sizeof(int)*(c
b990: 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66  nt+1));.      if
b9a0: 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65  ( aRoot==0 ) bre
b9b0: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  ak;.      for(cn
b9c0: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
b9d0: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
b9e0: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
b9f0: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
ba00: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
ba10: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
ba20: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
ba30: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
ba40: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
ba50: 20 29 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20   ) aRoot[cnt++] 
ba60: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
ba70: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
ba80: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
ba90: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
baa0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
bab0: 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70  aRoot[cnt++] = p
bac0: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
bad0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bae0: 20 20 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20     aRoot[cnt] = 
baf0: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  0;..      /* Mak
bb00: 65 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  e sure sufficien
bb10: 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  t number of regi
bb20: 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  sters have been 
bb30: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
bb40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
bb50: 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e  = MAX( pParse->n
bb60: 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a  Mem, 8+mxIdx );.
bb70: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  .      /* Do the
bb80: 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74   b-tree integrit
bb90: 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20  y checks */.    
bba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bbb0: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72  Op4(v, OP_Integr
bbc0: 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31  ityCk, 2, cnt, 1
bbd0: 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50  , (char*)aRoot,P
bbe0: 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20  4_INTARRAY);.   
bbf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
bc00: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69 29  angeP5(v, (u8)i)
bc10: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
bc20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bc30: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32  (v, OP_IsNull, 2
bc40: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
bc50: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
bc60: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
bc70: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
bc80: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
bc90: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
bca0: 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  "*** in database
bcb0: 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e   %s ***\n", db->
bcc0: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[i].zDbSName)
bcd0: 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44 59  ,.         P4_DY
bce0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
bcf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
bd00: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c 20 34  v, OP_Move, 2, 4
bd10: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
bd20: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bd30: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33   OP_Concat, 4, 3
bd40: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
bd50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bd60: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 32   OP_ResultRow, 2
bd70: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
bd80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
bd90: 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20 20  v, addr);..     
bda0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
bdb0: 6c 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 72  l the indices ar
bdc0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 63 6f  e constructed co
bdd0: 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
bde0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 78 3d 73 71  /.      for(x=sq
bdf0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54  liteHashFirst(pT
be00: 62 6c 73 29 3b 20 78 20 26 26 20 21 69 73 51 75  bls); x && !isQu
be10: 69 63 6b 3b 20 78 3d 73 71 6c 69 74 65 48 61 73  ick; x=sqliteHas
be20: 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20  hNext(x)){.     
be30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
be40: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
be50: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  x);.        Inde
be60: 78 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20  x *pIdx, *pPk;. 
be70: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
be80: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
be90: 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20    int loopTop;. 
bea0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61         int iData
beb0: 43 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20 20  Cur, iIdxCur;.  
bec0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2d        int r1 = -
bed0: 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  1;..        if( 
bee0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  pTab->pIndex==0 
bef0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bf00: 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77      pPk = HasRow
bf10: 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73  id(pTab) ? 0 : s
bf20: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
bf30: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
bf40: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
bf50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bf60: 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20 20   OP_IfPos, 1);  
bf70: 2f 2a 20 53 74 6f 70 20 69 66 20 6f 75 74 20 6f  /* Stop if out o
bf80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  f errors */.    
bf90: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
bfa0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
bfb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bfc0: 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29  , OP_Halt, 0, 0)
bfd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bfe0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
bff0: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
c000: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
c010: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
c020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
c030: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
c040: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
c050: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a  OP_OpenRead, 0,.
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43     1, 0, &iDataC
c090: 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20  ur, &iIdxCur);. 
c0a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c0b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c0c0: 6e 74 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20  nteger, 0, 7);. 
c0d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
c0e0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c0f0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c100: 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b  dx->pNext, j++){
c110: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c120: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c130: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38  OP_Integer, 0, 8
c140: 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e  +j); /* index en
c150: 74 72 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f  tries counter */
c160: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c170: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
c180: 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a  e->nMem>=8+j );.
c190: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c1a0: 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
c1b0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37  Range(pParse,1,7
c1c0: 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  +j) );.        s
c1d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c1e0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
c1f0: 44 61 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62  DataCur, 0); Vdb
c200: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c210: 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20        loopTop = 
c220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c230: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
c240: 37 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f  7, 1);.        /
c250: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
c260: 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  l NOT NULL colum
c270: 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f  ns really are NO
c280: 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  T NULL */.      
c290: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
c2a0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
c2b0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
c2c0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Err;.          i
c2d0: 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 3b 0a 20  nt jmp2, jmp3;. 
c2e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
c2f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
c300: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c310: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
c320: 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
c330: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c340: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c350: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
c360: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44  able(v, pTab, iD
c370: 61 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20  ataCur, j, 3);. 
c380: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c390: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c3a0: 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
c3b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
c3c0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
c3d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
c3e0: 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43 6f 76  ull, 3); VdbeCov
c3f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
c400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c410: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
c420: 6d 6d 2c 20 31 2c 20 2d 31 29 3b 20 2f 2a 20 44  mm, 1, -1); /* D
c430: 65 63 72 65 6d 65 6e 74 20 65 72 72 6f 72 20 6c  ecrement error l
c440: 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  imit */.        
c450: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
c460: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c  MPrintf(db, "NUL
c470: 4c 20 76 61 6c 75 65 20 69 6e 20 25 73 2e 25 73  L value in %s.%s
c480: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
c4b0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
c4c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
c4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
c4e0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
c4f0: 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34  , 3, 0, zErr, P4
c500: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
c510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c520: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
c530: 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a 20  ultRow, 3, 1);. 
c540: 20 20 20 20 20 20 20 20 20 6a 6d 70 33 20 3d 20           jmp3 = 
c550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c560: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  1(v, OP_IfPos, 1
c570: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
c580: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
c590: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
c5a0: 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20  v, OP_Halt);.   
c5b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c5c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
c5d0: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  p2);.          s
c5e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c5f0: 72 65 28 76 2c 20 6a 6d 70 33 29 3b 0a 20 20 20  re(v, jmp3);.   
c600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
c610: 2a 20 56 61 6c 69 64 61 74 65 20 69 6e 64 65 78  * Validate index
c620: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
c630: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   current row */.
c640: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
c650: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
c660: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
c670: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29  Idx->pNext, j++)
c680: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
c690: 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34  jmp2, jmp3, jmp4
c6a0: 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20 20  , jmp5;.        
c6b0: 20 20 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73    int ckUniq = s
c6c0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
c6d0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
c6e0: 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20    if( pPk==pIdx 
c6f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
c700: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
c710: 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
c720: 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ey(pParse, pIdx,
c730: 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 30 2c   iDataCur, 0, 0,
c740: 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20 20   &jmp3,.        
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c770: 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20  Prior, r1);.    
c780: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
c790: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Idx;.          s
c7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c7b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38  (v, OP_AddImm, 8
c7c0: 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20 69 6e 63 72  +j, 1);  /* incr
c7d0: 65 6d 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e  ement entry coun
c7e0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2f  t */.          /
c7f0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6e  * Verify that an
c800: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 65 78 69   index entry exi
c810: 73 74 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  sts for the curr
c820: 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  ent table row */
c830: 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20  .          jmp2 
c840: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c850: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
c860: 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 63  nd, iIdxCur+j, c
c870: 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20 20  kUniq, r1,.     
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
c8b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c8c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c8d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c8e0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d   OP_AddImm, 1, -
c8f0: 31 29 3b 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  1); /* Decrement
c900: 20 65 72 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a   error limit */.
c910: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c920: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
c930: 76 2c 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20  v, 3, "row ");. 
c940: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c950: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c960: 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33  _Concat, 7, 3, 3
c970: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c980: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
c990: 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69 73 73 69  ng(v, 4, " missi
c9a0: 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22 29  ng from index ")
c9b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c9c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c9d0: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33   OP_Concat, 4, 3
c9e0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
c9f0: 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp5 = sqlite3Vd
ca00: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
ca10: 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  4, pIdx->zName);
ca20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ca30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ca40: 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c  OP_Concat, 4, 3,
ca50: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   3);.          s
ca60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ca70: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
ca80: 2c 20 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 3, 1);.       
ca90: 20 20 20 6a 6d 70 34 20 3d 20 73 71 6c 69 74 65     jmp4 = sqlite
caa0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
cab0: 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20 56 64 62  P_IfPos, 1); Vdb
cac0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cae0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
caf0: 48 61 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Halt);.         
cb00: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
cb10: 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20  Here(v, jmp2);. 
cb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
cb30: 55 4e 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20  UNIQUE indexes, 
cb40: 76 65 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79  verify that only
cb50: 20 6f 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74   one entry exist
cb60: 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20  s with the.     
cb70: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
cb80: 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72 79 20  key.  The entry 
cb90: 69 73 20 75 6e 69 71 75 65 20 69 66 20 28 31 29  is unique if (1)
cba0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e   any column is N
cbb0: 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ULL.          **
cbc0: 20 6f 72 20 28 32 29 20 74 68 65 20 6e 65 78 74   or (2) the next
cbd0: 20 65 6e 74 72 79 20 68 61 73 20 61 20 64 69 66   entry has a dif
cbe0: 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20  ferent key */.  
cbf0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 55 6e          if( IsUn
cc00: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
cc10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
cc20: 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69  nt uniqOk = sqli
cc30: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
cc40: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
cc50: 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20   int jmp6;.     
cc60: 20 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20         int kk;. 
cc70: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
cc80: 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b  k=0; kk<pIdx->nK
cc90: 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20  eyCol; kk++){.  
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
ccb0: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
ccc0: 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20  olumn[kk];.     
ccd0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
cce0: 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44 20   iCol!=XN_ROWID 
ccf0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
cd00: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ol );.          
cd10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
cd20: 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  && pTab->aCol[iC
cd30: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f  ol].notNull ) co
cd40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
cd50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
cd70: 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69  Null, r1+kk, uni
cd80: 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  qOk);.          
cd90: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
cda0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
cdb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
cdc0: 6d 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp6 = sqlite3Vdb
cdd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65  eAddOp1(v, OP_Ne
cde0: 78 74 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b 20  xt, iIdxCur+j); 
cdf0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ce00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ce10: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
ce20: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
ce30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 36  JumpHere(v, jmp6
ce50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
ce60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ce70: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 47 54 2c  Int(v, OP_IdxGT,
ce80: 20 69 49 64 78 43 75 72 2b 6a 2c 20 75 6e 69 71   iIdxCur+j, uniq
ce90: 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  Ok, r1,.        
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e           pIdx->n
cec0: 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
ced0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
cee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cef0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
cf00: 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 20 2f 2a  dImm, 1, -1); /*
cf10: 20 44 65 63 72 65 6d 65 6e 74 20 65 72 72 6f 72   Decrement error
cf20: 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20   limit */.      
cf30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf40: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33  eLoadString(v, 3
cf50: 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e  , "non-unique en
cf60: 74 72 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b  try in index ");
cf70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
cf80: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
cf90: 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp5);.         
cfa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
cfb0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e  solveLabel(v, un
cfc0: 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  iqOk);.         
cfd0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
cfe0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
cff0: 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20  (v, jmp4);.     
d000: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f       sqlite3Reso
d010: 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
d020: 70 50 61 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20  pParse, jmp3);. 
d030: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d050: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
d060: 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70  DataCur, loopTop
d070: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
d080: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d090: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d0a0: 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23  v, loopTop-1);.#
d0b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d0c0: 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
d0d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d0e0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32  eLoadString(v, 2
d0f0: 2c 20 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e  , "wrong # of en
d100: 74 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22  tries in index "
d110: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
d120: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
d130: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d140: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
d150: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
d160: 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63  f( pPk==pIdx ) c
d170: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d180: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d190: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d1a0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
d1b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d1c0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 2c  (v, OP_IfPos, 1,
d1d0: 20 61 64 64 72 2b 32 29 3b 20 56 64 62 65 43 6f   addr+2); VdbeCo
d1e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d200: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
d210: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
d220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d230: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
d240: 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 33 29  t, iIdxCur+j, 3)
d250: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d260: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d270: 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c 20 61 64 64   OP_Eq, 8+j, add
d280: 72 2b 38 2c 20 33 29 3b 20 56 64 62 65 43 6f 76  r+8, 3); VdbeCov
d290: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
d2a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
d2b0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
d2c0: 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  E_NOTNULL);.    
d2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d2e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
d2f0: 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20 20  dImm, 1, -1);.  
d300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d310: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
d320: 20 33 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29   3, pIdx->zName)
d330: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d340: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d350: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 33 2c 20 32   OP_Concat, 3, 2
d360: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
d370: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d380: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
d390: 77 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20  w, 7, 1);.      
d3a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
d3b0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
d3c0: 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20  OUNT */.      } 
d3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20  .    }.    {.   
d3e0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d3f0: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
d400: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
d410: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
d420: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65  nst VdbeOpList e
d430: 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  ndCode[] = {.   
d440: 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
d450: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ,      1, 0,    
d460: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20      0},    /* 0 
d470: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
d480: 49 66 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  If,          1, 
d490: 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  4,        0},   
d4a0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20   /* 1 */.       
d4b0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
d4c0: 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
d4d0: 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20  0},    /* 2 */. 
d4e0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
d4f0: 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20  ltRow,   3, 1,  
d500: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
d510: 33 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20  3 */.      };.  
d520: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
d530: 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ..      aOp = sq
d540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
d550: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
d560: 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64  endCode), endCod
d570: 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69  e, iLn);.      i
d580: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 20 20  f( aOp ){.      
d590: 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 2d 6d    aOp[0].p2 = -m
d5a0: 78 45 72 72 3b 0a 20 20 20 20 20 20 20 20 61 4f  xErr;.        aO
d5b0: 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d 20 50 34  p[2].p4type = P4
d5c0: 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20  _STATIC;.       
d5d0: 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22   aOp[2].p4.z = "
d5e0: 6f 6b 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ok";.      }.   
d5f0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
d600: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d610: 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
d620: 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
d630: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
d640: 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  F16.  /*.  **   
d650: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 0a  PRAGMA encoding.
d660: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e    **   PRAGMA en
d670: 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d 38 22  coding = "utf-8"
d680: 7c 22 75 74 66 2d 31 36 22 7c 22 75 74 66 2d 31  |"utf-16"|"utf-1
d690: 36 6c 65 22 7c 22 75 74 66 2d 31 36 62 65 22 0a  6le"|"utf-16be".
d6a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69 74 73    **.  ** In its
d6b0: 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68 69   first form, thi
d6c0: 73 20 70 72 61 67 6d 61 20 72 65 74 75 72 6e 73  s pragma returns
d6d0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
d6e0: 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 64   the main.  ** d
d6f0: 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
d700: 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
d710: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69 74 20  initialized, it 
d720: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6e  is initialized n
d730: 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ow..  **.  ** Th
d740: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f 66  e second form of
d750: 20 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20   this pragma is 
d760: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6d  a no-op if the m
d770: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
d780: 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61  e.  ** has not a
d790: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69 74  lready been init
d7a0: 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68 69 73  ialized. In this
d7b0: 20 63 61 73 65 20 69 74 20 73 65 74 73 20 74 68   case it sets th
d7c0: 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 65  e default.  ** e
d7d0: 6e 63 6f 64 69 6e 67 20 74 68 61 74 20 77 69 6c  ncoding that wil
d7e0: 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
d7f0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
d800: 66 69 6c 65 20 69 66 20 61 20 6e 65 77 20 66 69  file if a new fi
d810: 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72 65 61 74  le.  ** is creat
d820: 65 64 2e 20 49 66 20 61 6e 20 65 78 69 73 74 69  ed. If an existi
d830: 6e 67 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  ng main database
d840: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c   file is opened,
d850: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64   then the.  ** d
d860: 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f  efault text enco
d870: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 65 78 69  ding for the exi
d880: 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 69  sting database i
d890: 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a 20 20  s used..  ** .  
d8a0: 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 20  ** In all cases 
d8b0: 6e 65 77 20 64 61 74 61 62 61 73 65 73 20 63 72  new databases cr
d8c0: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
d8d0: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20 61  ATTACH command a
d8e0: 72 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  re.  ** created 
d8f0: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
d900: 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63  default text enc
d910: 6f 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61 69  oding as the mai
d920: 6e 20 64 61 74 61 62 61 73 65 2e 20 49 66 0a 20  n database. If. 
d930: 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74   ** the main dat
d940: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62 65  abase has not be
d950: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
d960: 6e 64 2f 6f 72 20 63 72 65 61 74 65 64 20 77 68  nd/or created wh
d970: 65 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a 20 69  en ATTACH.  ** i
d980: 73 20 65 78 65 63 75 74 65 64 2c 20 74 68 69 73  s executed, this
d990: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
d9a0: 74 68 65 20 41 54 54 41 43 48 20 6f 70 65 72 61  the ATTACH opera
d9b0: 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
d9c0: 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  In the second fo
d9d0: 72 6d 20 74 68 69 73 20 70 72 61 67 6d 61 20 73  rm this pragma s
d9e0: 65 74 73 20 74 68 65 20 74 65 78 74 20 65 6e 63  ets the text enc
d9f0: 6f 64 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  oding to be used
da00: 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64 61 74   in.  ** new dat
da10: 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
da20: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
da30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
da40: 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  It is only.  ** 
da50: 75 73 65 66 75 6c 20 69 66 20 69 6e 76 6f 6b 65  useful if invoke
da60: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
da70: 74 65 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ter the main dat
da80: 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20 20 63  abase i.  */.  c
da90: 61 73 65 20 50 72 61 67 54 79 70 5f 45 4e 43 4f  ase PragTyp_ENCO
daa0: 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74 61 74  DING: {.    stat
dab0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
dac0: 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20 20 20  EncName {.      
dad0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
dae0: 20 20 20 75 38 20 65 6e 63 3b 0a 20 20 20 20 7d     u8 enc;.    }
daf0: 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a   encnames[] = {.
db00: 20 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c 20        { "UTF8", 
db10: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
db20: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
db30: 7b 20 22 55 54 46 2d 38 22 2c 20 20 20 20 53 51  { "UTF-8",    SQ
db40: 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20  LITE_UTF8       
db50: 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   },  /* Must be 
db60: 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20  element [1] */. 
db70: 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c 65       { "UTF-16le
db80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
db90: 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73  E     },  /* Mus
dba0: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 32 5d  t be element [2]
dbb0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
dbc0: 2d 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16be", SQLITE_U
dbd0: 54 46 31 36 42 45 20 20 20 20 20 7d 2c 20 20 2f  TF16BE     },  /
dbe0: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
dbf0: 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [3] */.      {
dc00: 20 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51 4c   "UTF16le",  SQL
dc10: 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20  ITE_UTF16LE     
dc20: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  },.      { "UTF1
dc30: 36 62 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54  6be",  SQLITE_UT
dc40: 46 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20 20  F16BE     },.   
dc50: 20 20 20 7b 20 22 55 54 46 2d 31 36 22 2c 20 20     { "UTF-16",  
dc60: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
dc70: 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45      }, /* SQLITE
dc80: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a  _UTF16NATIVE */.
dc90: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 22 2c        { "UTF16",
dca0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
dcb0: 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c         }, /* SQL
dcc0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
dcd0: 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20  */.      { 0, 0 
dce0: 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f 6e  }.    };.    con
dcf0: 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d  st struct EncNam
dd00: 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69 66 28  e *pEnc;.    if(
dd10: 20 21 7a 52 69 67 68 74 20 29 7b 20 20 20 20 2f   !zRight ){    /
dd20: 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  * "PRAGMA encodi
dd30: 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ng" */.      if(
dd40: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
dd50: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
dd60: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
dd70: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
dd80: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 38  ames[SQLITE_UTF8
dd90: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
dda0: 46 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  F8 );.      asse
ddb0: 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c  rt( encnames[SQL
ddc0: 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65 6e 63  ITE_UTF16LE].enc
ddd0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
dde0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ddf0: 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54  ( encnames[SQLIT
de00: 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63 3d 3d  E_UTF16BE].enc==
de10: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
de20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
de30: 6e 67 6c 65 54 65 78 74 28 76 2c 20 65 6e 63 6e  ngleText(v, encn
de40: 61 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65 2d  ames[ENC(pParse-
de50: 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >db)].zName);.  
de60: 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  /* "PRAGMA encod
de90: 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20  ing = XXX" */.  
dea0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e      /* Only chan
deb0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
dec0: 73 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74 68  sqlite.enc if th
ded0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
dee0: 65 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  e is not.      *
def0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49  * initialized. I
df00: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
df10: 61 73 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ase exists, the 
df20: 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20 76  new sqlite.enc v
df30: 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77 69  alue.      ** wi
df40: 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
df50: 6e 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  n when the schem
df60: 61 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65 64  a is next loaded
df70: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
df80: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
df90: 79 20 65 78 69 73 74 73 2c 20 69 74 20 77 69 6c  y exists, it wil
dfa0: 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20  l be created to 
dfb0: 75 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63 6f  use the new enco
dfc0: 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20 20  ding value..    
dfd0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 0a    */.      if( .
dfe0: 20 20 20 20 20 20 20 20 21 28 44 62 48 61 73 50          !(DbHasP
dff0: 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44  roperty(db, 0, D
e000: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 29  B_SchemaLoaded))
e010: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62 48   || .        DbH
e020: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30  asProperty(db, 0
e030: 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20 20  , DB_Empty) .   
e040: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f     ){.        fo
e050: 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73  r(pEnc=&encnames
e060: 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65  [0]; pEnc->zName
e070: 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20  ; pEnc++){.     
e080: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
e090: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
e0a0: 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20  t, pEnc->zName) 
e0b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
e0c0: 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20  CHEMA_ENC(db) = 
e0d0: 45 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20 20  ENC(db) =.      
e0e0: 20 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d 3e            pEnc->
e0f0: 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20  enc ? pEnc->enc 
e100: 3a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  : SQLITE_UTF16NA
e110: 54 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20  TIVE;.          
e120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e130: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
e140: 20 20 20 20 20 20 20 69 66 28 20 21 70 45 6e 63         if( !pEnc
e150: 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
e160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e170: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
e180: 73 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69  supported encodi
e190: 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29  ng: %s", zRight)
e1a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e1b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e1c0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
e1d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
e1e0: 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
e1f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
e200: 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41  A_VERSION_PRAGMA
e210: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
e220: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63  AGMA [schema.]sc
e230: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  hema_version.  *
e240: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
e250: 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69  ma.]schema_versi
e260: 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  on = <integer>. 
e270: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e280: 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f  A [schema.]user_
e290: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50  version.  **   P
e2a0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75  RAGMA [schema.]u
e2b0: 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69  ser_version = <i
e2c0: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
e2d0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
e2e0: 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75  ma.]freelist_cou
e2f0: 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  nt.  **.  **   P
e300: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64  RAGMA [schema.]d
e310: 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ata_version.  **
e320: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e330: 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74  schema.]applicat
e340: 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52  ion_id.  **   PR
e350: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70  AGMA [schema.]ap
e360: 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c  plication_id = <
e370: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
e380: 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73 20  ** The pragma's 
e390: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61  schema_version a
e3a0: 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20  nd user_version 
e3b0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 20  are used to set 
e3c0: 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65 20  or get.  ** the 
e3d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 68  value of the sch
e3e0: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
e3f0: 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65  user-version, re
e400: 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74 68  spectively. Both
e410: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
e420: 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68 65  -version and the
e430: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61 72   user-version ar
e440: 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  e 32-bit signed 
e450: 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73 74  integers.  ** st
e460: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
e470: 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  base header..  *
e480: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65 6d  *.  ** The schem
e490: 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75 61  a-cookie is usua
e4a0: 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  lly only manipul
e4b0: 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ated internally 
e4c0: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20 20  by SQLite. It.  
e4d0: 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ** is incremente
e4e0: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
e4f0: 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
e500: 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64 69  e schema is modi
e510: 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63 72  fied (by.  ** cr
e520: 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70 69  eating or droppi
e530: 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  ng a table or in
e540: 64 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d 61  dex). The schema
e550: 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64   version is used
e560: 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   by.  ** SQLite 
e570: 65 61 63 68 20 74 69 6d 65 20 61 20 71 75 65 72  each time a quer
e580: 79 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f  y is executed to
e590: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
e5a0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 0a   internal cache.
e5b0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65    ** of the sche
e5c0: 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d  ma used when com
e5d0: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 71  piling the SQL q
e5e0: 75 65 72 79 20 6d 61 74 63 68 65 73 20 74 68 65  uery matches the
e5f0: 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20   schema of.  ** 
e600: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 67 61  the database aga
e610: 69 6e 73 74 20 77 68 69 63 68 20 74 68 65 20 63  inst which the c
e620: 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69 73  ompiled query is
e630: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
e640: 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72 74  ed..  ** Subvert
e650: 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e 69  ing this mechani
e660: 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52 41  sm by using "PRA
e670: 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
e680: 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20  on" to modify.  
e690: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
e6a0: 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69  rsion is potenti
e6b0: 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20 61  ally dangerous a
e6c0: 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 70  nd may lead to p
e6d0: 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73  rogram.  ** cras
e6e0: 68 65 73 20 6f 72 20 64 61 74 61 62 61 73 65 20  hes or database 
e6f0: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65 20  corruption. Use 
e700: 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20 20  with caution!.  
e710: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65 72  **.  ** The user
e720: 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20  -version is not 
e730: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
e740: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d 61  by SQLite. It ma
e750: 79 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  y be used by.  *
e760: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66  * applications f
e770: 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a  or any purpose..
e780: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
e790: 54 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55 45  Typ_HEADER_VALUE
e7a0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f  : {.    int iCoo
e7b0: 6b 69 65 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69  kie = pPragma->i
e7c0: 41 72 67 3b 20 20 2f 2a 20 57 68 69 63 68 20 63  Arg;  /* Which c
e7d0: 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f 72  ookie to read or
e7e0: 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 73 71   write */.    sq
e7f0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
e800: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
e810: 69 66 28 20 7a 52 69 67 68 74 20 26 26 20 28 70  if( zRight && (p
e820: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
e830: 20 26 20 50 72 61 67 46 6c 67 5f 52 65 61 64 4f   & PragFlg_ReadO
e840: 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nly)==0 ){.     
e850: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 70   /* Write the sp
e860: 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76  ecified cookie v
e870: 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  alue */.      st
e880: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
e890: 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b  pList setCookie[
e8a0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
e8b0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
e8c0: 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20     0,  1,  0},  
e8d0: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
e8e0: 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65    { OP_SetCookie
e8f0: 2c 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  ,      0,  0,  0
e900: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
e910: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62      };.      Vdb
e920: 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20  eOp *aOp;.      
e930: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
e940: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
e950: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  d(v, ArraySize(s
e960: 65 74 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20  etCookie));.    
e970: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
e980: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
e990: 41 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f  ArraySize(setCoo
e9a0: 6b 69 65 29 2c 20 73 65 74 43 6f 6f 6b 69 65 2c  kie), setCookie,
e9b0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f   0);.      if( O
e9c0: 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53  NLY_IF_REALLOC_S
e9d0: 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20  TRESS(aOp==0) ) 
e9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70  break;.      aOp
e9f0: 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [0].p1 = iDb;.  
ea00: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20      aOp[1].p1 = 
ea10: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
ea20: 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a  ].p2 = iCookie;.
ea30: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20        aOp[1].p3 
ea40: 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  = sqlite3Atoi(zR
ea50: 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ight);.    }else
ea60: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  {.      /* Read 
ea70: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  the specified co
ea80: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
ea90: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
eaa0: 20 56 64 62 65 4f 70 4c 69 73 74 20 72 65 61 64   VdbeOpList read
eab0: 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20  Cookie[] = {.   
eac0: 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61       { OP_Transa
ead0: 63 74 69 6f 6e 2c 20 20 20 20 20 30 2c 20 20 30  ction,     0,  0
eae0: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a  ,  0},    /* 0 *
eaf0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52  /.        { OP_R
eb00: 65 61 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  eadCookie,      
eb10: 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  1,  0},    /
eb20: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 1 */.        {
eb30: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20   OP_ResultRow,  
eb40: 20 20 20 20 20 31 2c 20 20 31 2c 20 20 30 7d 0a       1,  1,  0}.
eb50: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56        };.      V
eb60: 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20  dbeOp *aOp;.    
eb70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72    sqlite3VdbeVer
eb80: 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69  ifyNoMallocRequi
eb90: 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65  red(v, ArraySize
eba0: 28 72 65 61 64 43 6f 6f 6b 69 65 29 29 3b 0a 20  (readCookie));. 
ebb0: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
ebc0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
ebd0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61  v, ArraySize(rea
ebe0: 64 43 6f 6f 6b 69 65 29 2c 72 65 61 64 43 6f 6f  dCookie),readCoo
ebf0: 6b 69 65 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  kie,0);.      if
ec00: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
ec10: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
ec20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ec30: 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[0].p1 = iDb;
ec40: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31  .      aOp[1].p1
ec50: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
ec60: 70 5b 31 5d 2e 70 33 20 3d 20 69 43 6f 6f 6b 69  p[1].p3 = iCooki
ec70: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
ec80: 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b  VdbeReusable(v);
ec90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
eca0: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
ecb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
ecc0: 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53  _VERSION_PRAGMAS
ecd0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
ece0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
ecf0: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 2f  OPTION_DIAGS.  /
ed00: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
ed10: 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a  compile_options.
ed20: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
ed30: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
ed40: 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  l compile-time o
ed50: 70 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20 74  ptions used in t
ed60: 68 69 73 20 62 75 69 6c 64 2c 0a 20 20 2a 2a 20  his build,.  ** 
ed70: 6f 6e 65 20 6f 70 74 69 6f 6e 20 70 65 72 20 72  one option per r
ed80: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ow..  */.  case 
ed90: 50 72 61 67 54 79 70 5f 43 4f 4d 50 49 4c 45 5f  PragTyp_COMPILE_
eda0: 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 69  OPTIONS: {.    i
edb0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f  nt i = 0;.    co
edc0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a  nst char *zOpt;.
edd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
ede0: 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 1;.    while(
edf0: 20 28 7a 4f 70 74 20 3d 20 73 71 6c 69 74 65 33   (zOpt = sqlite3
ee00: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
ee10: 65 74 28 69 2b 2b 29 29 21 3d 30 20 29 7b 0a 20  et(i++))!=0 ){. 
ee20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ee30: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c  LoadString(v, 1,
ee40: 20 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 73 71   zOpt);.      sq
ee50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ee60: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
ee70: 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
ee80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75    sqlite3VdbeReu
ee90: 73 61 62 6c 65 28 76 29 3b 0a 20 20 7d 0a 20 20  sable(v);.  }.  
eea0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
eeb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
eec0: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
eed0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
eee0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f  ITE_OMIT_WAL.  /
eef0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
ef00: 5b 73 63 68 65 6d 61 2e 5d 77 61 6c 5f 63 68 65  [schema.]wal_che
ef10: 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73 73 69 76  ckpoint = passiv
ef20: 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72 74 7c 74  e|full|restart|t
ef30: 72 75 6e 63 61 74 65 0a 20 20 2a 2a 0a 20 20 2a  runcate.  **.  *
ef40: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 74 68 65  * Checkpoint the
ef50: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
ef60: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 57    case PragTyp_W
ef70: 41 4c 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b  AL_CHECKPOINT: {
ef80: 0a 20 20 20 20 69 6e 74 20 69 42 74 20 3d 20 28  .    int iBt = (
ef90: 70 49 64 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49  pId2->z?iDb:SQLI
efa0: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 29  TE_MAX_ATTACHED)
efb0: 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20  ;.    int eMode 
efc0: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
efd0: 49 4e 54 5f 50 41 53 53 49 56 45 3b 0a 20 20 20  INT_PASSIVE;.   
efe0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
eff0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f000: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
f010: 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "full")==0 ){.  
f020: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51        eMode = SQ
f030: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
f040: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  FULL;.      }els
f050: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
f060: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 72 65  ICmp(zRight, "re
f070: 73 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20  start")==0 ){.  
f080: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51        eMode = SQ
f090: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
f0a0: 52 45 53 54 41 52 54 3b 0a 20 20 20 20 20 20 7d  RESTART;.      }
f0b0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
f0c0: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
f0d0: 22 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 20 29  "truncate")==0 )
f0e0: 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
f0f0: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
f100: 49 4e 54 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20  INT_TRUNCATE;.  
f110: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f120: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
f130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f140: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 68  eAddOp3(v, OP_Ch
f150: 65 63 6b 70 6f 69 6e 74 2c 20 69 42 74 2c 20 65  eckpoint, iBt, e
f160: 4d 6f 64 65 2c 20 31 29 3b 0a 20 20 20 20 73 71  Mode, 1);.    sq
f170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f180: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
f190: 20 31 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 62 72   1, 3);.  }.  br
f1a0: 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  eak;..  /*.  ** 
f1b0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
f1c0: 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a  ocheckpoint.  **
f1d0: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75     PRAGMA wal_au
f1e0: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4e  tocheckpoint = N
f1f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69  .  **.  ** Confi
f200: 67 75 72 65 20 61 20 64 61 74 61 62 61 73 65 20  gure a database 
f210: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 75  connection to au
f220: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
f230: 6b 70 6f 69 6e 74 20 61 20 64 61 74 61 62 61 73  kpoint a databas
f240: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 63 63  e.  ** after acc
f250: 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66 72 61 6d  umulating N fram
f260: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 2e 20 4f  es in the log. O
f270: 72 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  r query for the 
f280: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 0a 20 20  current value.  
f290: 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20  ** of N..  */.  
f2a0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c  case PragTyp_WAL
f2b0: 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 3a  _AUTOCHECKPOINT:
f2c0: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
f2d0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
f2e0: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
f2f0: 70 6f 69 6e 74 28 64 62 2c 20 73 71 6c 69 74 65  point(db, sqlite
f300: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a  3Atoi(zRight));.
f310: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
f320: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 0a 20 20  SingleInt(v, .  
f330: 20 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c       db->xWalCal
f340: 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61  lback==sqlite3Wa
f350: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a  lDefaultHook ? .
f360: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
f370: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d  E_PTR_TO_INT(db-
f380: 3e 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a  >pWalArg) : 0);.
f390: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
f3a0: 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  dif..  /*.  **  
f3b0: 50 52 41 47 4d 41 20 73 68 72 69 6e 6b 5f 6d 65  PRAGMA shrink_me
f3c0: 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  mory.  **.  ** I
f3d0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
f3e0: 3a 20 52 2d 32 33 34 34 35 2d 34 36 31 30 39 20  : R-23445-46109 
f3f0: 54 68 69 73 20 70 72 61 67 6d 61 20 63 61 75 73  This pragma caus
f400: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
f410: 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
f420: 6f 6e 20 77 68 69 63 68 20 69 74 20 69 73 20 69  on which it is i
f430: 6e 76 6f 6b 65 64 20 74 6f 20 66 72 65 65 20 75  nvoked to free u
f440: 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  p as much memory
f450: 20 61 73 20 69 74 0a 20 20 2a 2a 20 63 61 6e 2c   as it.  ** can,
f460: 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
f470: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
f480: 65 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f 0a 20 20  emory()..  */.  
f490: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 48 52  case PragTyp_SHR
f4a0: 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20  INK_MEMORY: {.  
f4b0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c    sqlite3_db_rel
f4c0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b  ease_memory(db);
f4d0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f4e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
f4f0: 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74  GMA busy_timeout
f500: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62  .  **   PRAGMA b
f510: 75 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a  usy_timeout = N.
f520: 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73    **.  ** Call s
f530: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
f540: 6f 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65 74  out(db, N).  Ret
f550: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
f560: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20 20  timeout value.  
f570: 2a 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65 74  ** if one is set
f580: 2e 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68 61  .  If no busy ha
f590: 6e 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66 65  ndler or a diffe
f5a0: 72 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c 65  rent busy handle
f5b0: 72 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 68  r is set.  ** th
f5c0: 65 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  en 0 is returned
f5d0: 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 62  .  Setting the b
f5e0: 75 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30  usy_timeout to 0
f5f0: 20 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20 2a   or negative.  *
f600: 2a 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 74  * disables the t
f610: 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f  imeout..  */.  /
f620: 2a 63 61 73 65 20 50 72 61 67 54 79 70 5f 42 55  *case PragTyp_BU
f630: 53 59 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66  SY_TIMEOUT*/ def
f640: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73 65  ault: {.    asse
f650: 72 74 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72  rt( pPragma->ePr
f660: 61 67 54 79 70 3d 3d 50 72 61 67 54 79 70 5f 42  agTyp==PragTyp_B
f670: 55 53 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20  USY_TIMEOUT );. 
f680: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
f690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
f6a0: 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20  usy_timeout(db, 
f6b0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
f6c0: 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ht));.    }.    
f6d0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
f6e0: 76 2c 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f  v, db->busyTimeo
f6f0: 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ut);.    break;.
f700: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
f710: 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61   PRAGMA soft_hea
f720: 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 20 50  p_limit.  **   P
f730: 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f  RAGMA soft_heap_
f740: 6c 69 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20  limit = N.  **. 
f750: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
f760: 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33 34 33 2d 34  ON-OF: R-26343-4
f770: 35 39 33 30 20 54 68 69 73 20 70 72 61 67 6d 61  5930 This pragma
f780: 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 20 20 2a   invokes the.  *
f790: 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68  * sqlite3_soft_h
f7a0: 65 61 70 5f 6c 69 6d 69 74 36 34 28 29 20 69 6e  eap_limit64() in
f7b0: 74 65 72 66 61 63 65 20 77 69 74 68 20 74 68 65  terface with the
f7c0: 20 61 72 67 75 6d 65 6e 74 20 4e 2c 20 69 66 20   argument N, if 
f7d0: 4e 20 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66  N is.  ** specif
f7e0: 69 65 64 20 61 6e 64 20 69 73 20 61 20 6e 6f 6e  ied and is a non
f7f0: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
f800: 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  r..  ** IMPLEMEN
f810: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34  TATION-OF: R-644
f820: 35 31 2d 30 37 31 36 33 20 54 68 65 20 73 6f 66  51-07163 The sof
f830: 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 70 72 61  t_heap_limit pra
f840: 67 6d 61 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20  gma always.  ** 
f850: 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65  returns the same
f860: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 77 6f   integer that wo
f870: 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64 20  uld be returned 
f880: 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  by the.  ** sqli
f890: 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
f8a0: 6d 69 74 36 34 28 2d 31 29 20 43 2d 6c 61 6e 67  mit64(-1) C-lang
f8b0: 75 61 67 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  uage function.. 
f8c0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
f8d0: 79 70 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d  yp_SOFT_HEAP_LIM
f8e0: 49 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  IT: {.    sqlite
f8f0: 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69  3_int64 N;.    i
f900: 66 28 20 7a 52 69 67 68 74 20 26 26 20 73 71 6c  f( zRight && sql
f910: 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
f920: 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53  4(zRight, &N)==S
f930: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f940: 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
f950: 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a  eap_limit64(N);.
f960: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
f970: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c  SingleInt(v, sql
f980: 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
f990: 69 6d 69 74 36 34 28 2d 31 29 29 3b 0a 20 20 20  imit64(-1));.   
f9a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f9b0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f9c0: 74 68 72 65 61 64 73 0a 20 20 2a 2a 20 20 20 50  threads.  **   P
f9d0: 52 41 47 4d 41 20 74 68 72 65 61 64 73 20 3d 20  RAGMA threads = 
f9e0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  N.  **.  ** Conf
f9f0: 69 67 75 72 65 20 74 68 65 20 6d 61 78 69 6d 75  igure the maximu
fa00: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  m number of work
fa10: 65 72 20 74 68 72 65 61 64 73 2e 20 20 52 65 74  er threads.  Ret
fa20: 75 72 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  urn the new.  **
fa30: 20 6d 61 78 69 6d 75 6d 2c 20 77 68 69 63 68 20   maximum, which 
fa40: 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
fa50: 61 6e 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  an requested..  
fa60: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
fa70: 70 5f 54 48 52 45 41 44 53 3a 20 7b 0a 20 20 20  p_THREADS: {.   
fa80: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e   sqlite3_int64 N
fa90: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
faa0: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
fab0: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
fac0: 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
fad0: 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d  E_OK.     && N>=
fae0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  0.    ){.      s
faf0: 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
fb00: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
fb10: 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 28 69  RKER_THREADS, (i
fb20: 6e 74 29 28 4e 26 30 78 37 66 66 66 66 66 66 66  nt)(N&0x7fffffff
fb30: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
fb40: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
fb50: 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64   sqlite3_limit(d
fb60: 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  b, SQLITE_LIMIT_
fb70: 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20  WORKER_THREADS, 
fb80: 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  -1));.    break;
fb90: 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  .  }..#if define
fba0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
fbb0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
fbc0: 45 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a  E_TEST).  /*.  *
fbd0: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
fbe0: 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 66 69  rent state of fi
fbf0: 6c 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20  le logs for all 
fc00: 64 61 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20  databases.  */. 
fc10: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f   case PragTyp_LO
fc20: 43 4b 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20  CK_STATUS: {.   
fc30: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
fc40: 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b  ar *const azLock
fc50: 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Name[] = {.     
fc60: 20 22 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68   "unlocked", "sh
fc70: 61 72 65 64 22 2c 20 22 72 65 73 65 72 76 65 64  ared", "reserved
fc80: 22 2c 20 22 70 65 6e 64 69 6e 67 22 2c 20 22 65  ", "pending", "e
fc90: 78 63 6c 75 73 69 76 65 22 0a 20 20 20 20 7d 3b  xclusive".    };
fca0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fcb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
fcc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
fcd0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
fce0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
fcf0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
fd00: 61 72 20 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e  ar *zState = "un
fd10: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e  known";.      in
fd20: 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t j;.      if( d
fd30: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
fd40: 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  me==0 ) continue
fd50: 3b 0a 20 20 20 20 20 20 70 42 74 20 3d 20 64 62  ;.      pBt = db
fd60: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
fd70: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 7c      if( pBt==0 |
fd80: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  | sqlite3BtreePa
fd90: 67 65 72 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  ger(pBt)==0 ){. 
fda0: 20 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20         zState = 
fdb0: 22 63 6c 6f 73 65 64 22 3b 0a 20 20 20 20 20 20  "closed";.      
fdc0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
fdd0: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
fde0: 62 2c 20 69 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b, i ? db->aDb[i
fdf0: 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 2c 20  ].zDbSName : 0, 
fe00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 43 4e        SQLITE_FCN
fe30: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a  TL_LOCKSTATE, &j
fe40: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
fe50: 20 20 20 20 20 20 20 20 20 7a 53 74 61 74 65 20           zState 
fe60: 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b  = azLockName[j];
fe70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fe80: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
fe90: 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 22 2c 20  oad(v, 1, "ss", 
fea0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
feb0: 61 6d 65 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20  ame, zState);.  
fec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fed0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
fee0: 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b 0a 20 20  ltRow, 1, 2);.  
fef0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
ff00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
ff10: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
ff20: 45 43 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  EC.  case PragTy
ff30: 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28  p_KEY: {.    if(
ff40: 20 7a 52 69 67 68 74 20 29 20 73 71 6c 69 74 65   zRight ) sqlite
ff50: 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  3_key_v2(db, zDb
ff60: 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65  , zRight, sqlite
ff70: 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74  3Strlen30(zRight
ff80: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
ff90: 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79   }.  case PragTy
ffa0: 70 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69  p_REKEY: {.    i
ffb0: 66 28 20 7a 52 69 67 68 74 20 29 20 73 71 6c 69  f( zRight ) sqli
ffc0: 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c  te3_rekey_v2(db,
ffd0: 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73 71   zDb, zRight, sq
ffe0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52  lite3Strlen30(zR
fff0: 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65 61  ight));.    brea
10000 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72  k;.  }.  case Pr
10010 61 67 54 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a  agTyp_HEXKEY: {.
10020 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
10030 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65  {.      u8 iByte
10040 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
10050 20 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34       char zKey[4
10060 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0];.      for(i=
10070 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
10080 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20  zeof(zKey)*2 && 
10090 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
100a0 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29  zRight[i]); i++)
100b0 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65 20  {.        iByte 
100c0 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73  = (iByte<<4) + s
100d0 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
100e0 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20  Right[i]);.     
100f0 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20     if( (i&1)!=0 
10100 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42  ) zKey[i/2] = iB
10110 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yte;.      }.   
10120 20 20 20 69 66 28 20 28 7a 4c 65 66 74 5b 33 5d     if( (zLeft[3]
10130 20 26 20 30 78 66 29 3d 3d 30 78 62 20 29 7b 0a   & 0xf)==0xb ){.
10140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10150 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  key_v2(db, zDb, 
10160 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20  zKey, i/2);.    
10170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10180 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76   sqlite3_rekey_v
10190 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c  2(db, zDb, zKey,
101a0 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20   i/2);.      }. 
101b0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
101c0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
101d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
101e0 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
101f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
10200 45 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20  E_CEROD).  case 
10210 50 72 61 67 54 79 70 5f 41 43 54 49 56 41 54 45  PragTyp_ACTIVATE
10220 5f 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28  _EXTENSIONS: if(
10230 20 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65   zRight ){.#ifde
10240 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
10250 45 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  EC.    if( sqlit
10260 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68  e3StrNICmp(zRigh
10270 74 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30  t, "see-", 4)==0
10280 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10290 33 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28 26  3_activate_see(&
102a0 7a 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20  zRight[4]);.    
102b0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
102c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45  SQLITE_ENABLE_CE
102d0 52 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ROD.    if( sqli
102e0 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67  te3StrNICmp(zRig
102f0 68 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29  ht, "cerod-", 6)
10300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10310 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65  ite3_activate_ce
10320 72 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b  rod(&zRight[6]);
10330 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
10340 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
10350 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66  f..  } /* End of
10360 20 74 68 65 20 50 52 41 47 4d 41 20 73 77 69 74   the PRAGMA swit
10370 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  ch */..  /* The 
10380 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
10390 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
103a0 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
103b0 73 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f  s defined. Its o
103c0 6e 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65  nly.  ** purpose
103d0 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 61   is to execute a
103e0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
103f0 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ts to verify tha
10400 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72  t if the.  ** Pr
10410 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31  agFlg_NoColumns1
10420 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
10430 20 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63   the caller spec
10440 69 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e  ified an argumen
10450 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52  t.  ** to the PR
10460 41 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d  AGMA, the implem
10470 65 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74  entation has not
10480 20 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65   added any OP_Re
10490 73 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e  sultRow .  ** in
104a0 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68  structions to th
104b0 65 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20  e VM.  */.  if( 
104c0 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
104d0 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43  lg & PragFlg_NoC
104e0 6f 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67  olumns1) && zRig
104f0 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
10500 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73  3VdbeVerifyNoRes
10510 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a  ultRow(v);.  }..
10520 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71  pragma_out:.  sq
10530 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10540 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  zLeft);.  sqlite
10550 33 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67  3DbFree(db, zRig
10560 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53  ht);.}.#ifndef S
10570 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10580 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  ALTABLE./*******
10590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ******.** Implem
105e0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65  entation of an e
105f0 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
10600 20 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73   table that runs
10610 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f   a pragma..**.*/
10620 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
10630 50 72 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d  PragmaVtab Pragm
10640 61 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73  aVtab;.typedef s
10650 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
10660 43 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61  Cursor PragmaVta
10670 62 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20  bCursor;.struct 
10680 50 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73  PragmaVtab {.  s
10690 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65  qlite3_vtab base
106a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65  ;        /* Base
106b0 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65   class.  Must be
106c0 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69   first */.  sqli
106d0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
106e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
106f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10700 20 74 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c   to which it bel
10710 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ongs */.  const 
10720 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d  PragmaName *pNam
10730 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
10740 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75  he pragma */.  u
10750 38 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20  8 nHidden;      
10760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10770 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c  er of hidden col
10780 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69  umns */.  u8 iHi
10790 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  dden;           
107a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
107b0 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e  the first hidden
107c0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74   column */.};.st
107d0 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43  ruct PragmaVtabC
107e0 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65  ursor {.  sqlite
107f0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61  3_vtab_cursor ba
10800 73 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73  se; /* Base clas
10810 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73  s.  Must be firs
10820 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  t */.  sqlite3_s
10830 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  tmt *pPragma;   
10840 20 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73   /* The pragma s
10850 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20  tatement to run 
10860 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  */.  sqlite_int6
10870 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f  4 iRowid;      /
10880 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  * Current rowid 
10890 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67  */.  char *azArg
108a0 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  [2];           /
108b0 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61  * Value of the a
108c0 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65  rgument and sche
108d0 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  ma */.};../* .**
108e0 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
108f0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f  table module xCo
10900 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f  nnect method..*/
10910 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
10920 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20  maVtabConnect(. 
10930 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
10940 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e  void *pAux,.  in
10950 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
10960 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a  ar *const*argv,.
10970 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
10980 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20  *ppVtab,.  char 
10990 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e  **pzErr.){.  con
109a0 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
109b0 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20  Pragma = (const 
109c0 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78  PragmaName*)pAux
109d0 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a  ;.  PragmaVtab *
109e0 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pTab = 0;.  int 
109f0 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rc;.  int i, j;.
10a00 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28    char cSep = '(
10a10 27 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  ';.  StrAccum ac
10a20 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32  c;.  char zBuf[2
10a30 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  00];..  UNUSED_P
10a40 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
10a50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10a60 45 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69  ER(argv);.  sqli
10a70 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
10a80 26 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73  &acc, 0, zBuf, s
10a90 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b  izeof(zBuf), 0);
10aa0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
10ab0 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63  umAppendAll(&acc
10ac0 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
10ad0 78 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  x");.  for(i=0, 
10ae0 6a 3d 70 50 72 61 67 6d 61 2d 3e 69 50 72 61 67  j=pPragma->iPrag
10af0 43 4e 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61  CName; i<pPragma
10b00 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b  ->nPragCName; i+
10b10 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  +, j++){.    sql
10b20 69 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63  ite3XPrintf(&acc
10b30 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53  , "%c\"%s\"", cS
10b40 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d  ep, pragCName[j]
10b50 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c  );.    cSep = ',
10b60 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d  ';.  }.  if( i==
10b70 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10b80 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 28  XPrintf(&acc, "(
10b90 5c 22 25 73 5c 22 22 2c 20 70 50 72 61 67 6d 61  \"%s\"", pPragma
10ba0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 63 53  ->zName);.    cS
10bb0 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 69 2b  ep = ',';.    i+
10bc0 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a  +;.  }.  j = 0;.
10bd0 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d    if( pPragma->m
10be0 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
10bf0 67 5f 52 65 73 75 6c 74 31 20 29 7b 0a 20 20 20  g_Result1 ){.   
10c00 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
10c10 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20  AppendAll(&acc, 
10c20 22 2c 61 72 67 20 48 49 44 44 45 4e 22 29 3b 0a  ",arg HIDDEN");.
10c30 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 69      j++;.  }.  i
10c40 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  f( pPragma->mPra
10c50 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f  gFlg & (PragFlg_
10c60 53 63 68 65 6d 61 4f 70 74 7c 50 72 61 67 46 6c  SchemaOpt|PragFl
10c70 67 5f 53 63 68 65 6d 61 52 65 71 29 20 29 7b 0a  g_SchemaReq) ){.
10c80 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
10c90 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63  cumAppendAll(&ac
10ca0 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44  c, ",schema HIDD
10cb0 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  EN");.    j++;. 
10cc0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
10cd0 63 63 75 6d 41 70 70 65 6e 64 28 26 61 63 63 2c  ccumAppend(&acc,
10ce0 20 22 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69   ")", 1);.  sqli
10cf0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
10d00 68 28 26 61 63 63 29 3b 0a 20 20 61 73 73 65 72  h(&acc);.  asser
10d10 74 28 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 20  t( strlen(zBuf) 
10d20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  < sizeof(zBuf)-1
10d30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
10d40 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
10d50 64 62 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28  db, zBuf);.  if(
10d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10d70 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 28 50 72  {.    pTab = (Pr
10d80 61 67 6d 61 56 74 61 62 2a 29 73 71 6c 69 74 65  agmaVtab*)sqlite
10d90 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
10da0 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20  PragmaVtab));.  
10db0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
10dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10dd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
10de0 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
10df0 74 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f  t(pTab, 0, sizeo
10e00 66 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a  f(PragmaVtab));.
10e10 20 20 20 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d        pTab->pNam
10e20 65 20 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20 20  e = pPragma;.   
10e30 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62     pTab->db = db
10e40 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 48  ;.      pTab->iH
10e50 69 64 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20  idden = i;.     
10e60 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d   pTab->nHidden =
10e70 20 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   j;.    }.  }els
10e80 65 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  e{.    *pzErr = 
10e90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10ea0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
10eb0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a  rmsg(db));.  }..
10ec0 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c    *ppVtab = (sql
10ed0 69 74 65 33 5f 76 74 61 62 2a 29 70 54 61 62 3b  ite3_vtab*)pTab;
10ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10ef0 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
10f00 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
10f10 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  ule xDisconnect 
10f20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
10f30 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
10f40 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74  Disconnect(sqlit
10f50 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
10f60 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
10f70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Tab = (PragmaVta
10f80 62 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  b*)pVtab;.  sqli
10f90 74 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a  te3_free(pTab);.
10fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10fb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65  OK;.}../* Figure
10fc0 20 6f 75 74 20 74 68 65 20 62 65 73 74 20 69 6e   out the best in
10fd0 64 65 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65  dex to use to se
10fe0 61 72 63 68 20 61 20 70 72 61 67 6d 61 20 76 69  arch a pragma vi
10ff0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
11000 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 74  ** There are not
11010 20 72 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65   really any inde
11020 78 20 63 68 6f 69 63 65 73 2e 20 20 42 75 74 20  x choices.  But 
11030 77 65 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75  we want to encou
11040 72 61 67 65 20 74 68 65 0a 2a 2a 20 71 75 65 72  rage the.** quer
11050 79 20 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76  y planner to giv
11060 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
11070 20 6f 6e 20 61 73 20 6d 61 6e 79 20 68 69 64 64   on as many hidd
11080 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 73  en parameters as
11090 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e  .** possible, an
110a0 64 20 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20  d especially on 
110b0 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e  the first hidden
110c0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 6f 20   parameter.  So 
110d0 72 65 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68  return a.** high
110e0 20 63 6f 73 74 20 69 66 20 68 69 64 64 65 6e 20   cost if hidden 
110f0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 75  parameters are u
11100 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f  nconstrained..*/
11110 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
11120 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 28  maVtabBestIndex(
11130 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
11140 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
11150 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29  _info *pIdxInfo)
11160 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a  {.  PragmaVtab *
11170 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74  pTab = (PragmaVt
11180 61 62 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74  ab*)tab;.  const
11190 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
111a0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
111b0 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20   *pConstraint;. 
111c0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
111d0 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64   seen[2];..  pId
111e0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
111f0 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31  Cost = (double)1
11200 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48  ;.  if( pTab->nH
11210 69 64 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75  idden==0 ){ retu
11220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a  rn SQLITE_OK; }.
11230 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    pConstraint = 
11240 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
11250 72 61 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d  raint;.  seen[0]
11260 20 3d 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20   = 0;.  seen[1] 
11270 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
11280 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
11290 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43  straint; i++, pC
112a0 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20  onstraint++){.  
112b0 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
112c0 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63  t->usable==0 ) c
112d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
112e0 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
112f0 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  !=SQLITE_INDEX_C
11300 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63  ONSTRAINT_EQ ) c
11310 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
11320 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
11330 6f 6c 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48  olumn < pTab->iH
11340 69 64 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65  idden ) continue
11350 3b 0a 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74  ;.    j = pConst
11360 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d  raint->iColumn -
11370 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a   pTab->iHidden;.
11380 20 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20      assert( j < 
11390 32 20 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d  2 );.    seen[j]
113a0 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66   = i+1;.  }.  if
113b0 28 20 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a  ( seen[0]==0 ){.
113c0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
113d0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
113e0 6f 75 62 6c 65 29 32 31 34 37 34 38 33 36 34 37  ouble)2147483647
113f0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
11400 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
11410 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20  2147483647;.    
11420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11430 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e  ;.  }.  j = seen
11440 5b 30 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66  [0]-1;.  pIdxInf
11450 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11460 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78  age[j].argvIndex
11470 20 3d 20 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 1;.  pIdxInfo
11480 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
11490 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  ge[j].omit = 1;.
114a0 20 20 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30    if( seen[1]==0
114b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
114c0 5f 4f 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  _OK;.  pIdxInfo-
114d0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
114e0 20 28 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70   (double)20;.  p
114f0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
11500 65 64 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a  edRows = 20;.  j
11510 20 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20   = seen[1]-1;.  
11520 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
11530 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72  raintUsage[j].ar
11540 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70  gvIndex = 2;.  p
11550 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11560 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69  aintUsage[j].omi
11570 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
11580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11590 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
115a0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 70 72 61  rsor for the pra
115b0 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
115c0 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
115d0 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 28 73  pragmaVtabOpen(s
115e0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
115f0 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ab, sqlite3_vtab
11600 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
11610 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  or){.  PragmaVta
11620 62 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20  bCursor *pCsr;. 
11630 20 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56   pCsr = (PragmaV
11640 74 61 62 43 75 72 73 6f 72 2a 29 73 71 6c 69 74  tabCursor*)sqlit
11650 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
11660 28 2a 70 43 73 72 29 29 3b 0a 20 20 69 66 28 20  (*pCsr));.  if( 
11670 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
11680 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11690 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c   memset(pCsr, 0,
116a0 20 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74   sizeof(PragmaVt
116b0 61 62 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43  abCursor));.  pC
116c0 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d  sr->base.pVtab =
116d0 20 70 56 74 61 62 3b 0a 20 20 2a 70 70 43 75 72   pVtab;.  *ppCur
116e0 73 6f 72 20 3d 20 26 70 43 73 72 2d 3e 62 61 73  sor = &pCsr->bas
116f0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
11700 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65  TE_OK;.}../* Cle
11710 61 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66  ar all content f
11720 72 6f 6d 20 70 72 61 67 6d 61 20 76 69 72 74 75  rom pragma virtu
11730 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  al table cursor.
11740 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
11750 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  pragmaVtabCursor
11760 43 6c 65 61 72 28 50 72 61 67 6d 61 56 74 61 62  Clear(PragmaVtab
11770 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
11780 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
11790 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d  3_finalize(pCsr-
117a0 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20 70 43 73  >pPragma);.  pCs
117b0 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a  r->pPragma = 0;.
117c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
117d0 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41  aySize(pCsr->azA
117e0 72 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rg); i++){.    s
117f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
11800 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  ->azArg[i]);.   
11810 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20   pCsr->azArg[i] 
11820 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43  = 0;.  }.}../* C
11830 6c 6f 73 65 20 61 20 70 72 61 67 6d 61 20 76 69  lose a pragma vi
11840 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
11850 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  or */.static int
11860 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65   pragmaVtabClose
11870 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
11880 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50 72  rsor *cur){.  Pr
11890 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
118a0 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
118b0 61 62 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  abCursor*)cur;. 
118c0 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   pragmaVtabCurso
118d0 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20  rClear(pCsr);.  
118e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
118f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
11900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64  ITE_OK;.}../* Ad
11910 76 61 6e 63 65 20 74 68 65 20 70 72 61 67 6d 61  vance the pragma
11920 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
11930 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
11940 74 20 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20  t row */.static 
11950 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4e 65  int pragmaVtabNe
11960 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  xt(sqlite3_vtab_
11970 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
11980 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  sor){.  PragmaVt
11990 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
119a0 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
119b0 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
119c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
119d0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63  TE_OK;..  /* Inc
119e0 72 65 6d 65 6e 74 20 74 68 65 20 78 52 6f 77 69  rement the xRowi
119f0 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73  d value */.  pCs
11a00 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61  r->iRowid++;.  a
11a10 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 50 72  ssert( pCsr->pPr
11a20 61 67 6d 61 20 29 3b 0a 20 20 69 66 28 20 53 51  agma );.  if( SQ
11a30 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65  LITE_ROW!=sqlite
11a40 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 50 72  3_step(pCsr->pPr
11a50 61 67 6d 61 29 20 29 7b 0a 20 20 20 20 72 63 20  agma) ){.    rc 
11a60 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
11a70 7a 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  ze(pCsr->pPragma
11a80 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 50 72  );.    pCsr->pPr
11a90 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 72  agma = 0;.    pr
11aa0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
11ab0 65 61 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20  ear(pCsr);.  }. 
11ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11ad0 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
11ae0 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
11af0 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
11b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11b10 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72  pragmaVtabFilter
11b20 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
11b30 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
11b40 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78  rsor, .  int idx
11b50 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Num, const char 
11b60 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61  *idxStr,.  int a
11b70 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
11b80 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50  ue **argv.){.  P
11b90 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
11ba0 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
11bb0 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62  tabCursor*)pVtab
11bc0 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61  Cursor;.  Pragma
11bd0 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72  Vtab *pTab = (Pr
11be0 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62  agmaVtab*)(pVtab
11bf0 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a  Cursor->pVtab);.
11c00 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
11c10 69 2c 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d  i, j;.  StrAccum
11c20 20 61 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53   acc;.  char *zS
11c30 71 6c 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ql;..  UNUSED_PA
11c40 52 41 4d 45 54 45 52 28 69 64 78 4e 75 6d 29 3b  RAMETER(idxNum);
11c50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11c60 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20 70  TER(idxStr);.  p
11c70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
11c80 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 6a 20  lear(pCsr);.  j 
11c90 3d 20 28 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e  = (pTab->pName->
11ca0 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
11cb0 6c 67 5f 52 65 73 75 6c 74 31 29 21 3d 30 20 3f  lg_Result1)!=0 ?
11cc0 20 30 20 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d   0 : 1;.  for(i=
11cd0 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20  0; i<argc; i++, 
11ce0 6a 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  j++){.    assert
11cf0 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43  ( j<ArraySize(pC
11d00 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20  sr->azArg) );.  
11d10 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d    pCsr->azArg[j]
11d20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
11d30 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
11d40 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
11d50 5b 69 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [i]));.    if( p
11d60 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30  Csr->azArg[j]==0
11d70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11d80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11d90 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
11da0 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
11db0 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70 54  acc, 0, 0, 0, pT
11dc0 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ab->db->aLimit[S
11dd0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
11de0 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c 69  LENGTH]);.  sqli
11df0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
11e00 64 41 6c 6c 28 26 61 63 63 2c 20 22 50 52 41 47  dAll(&acc, "PRAG
11e10 4d 41 20 22 29 3b 0a 20 20 69 66 28 20 70 43 73  MA ");.  if( pCs
11e20 72 2d 3e 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20  r->azArg[1] ){. 
11e30 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
11e40 66 28 26 61 63 63 2c 20 22 25 51 2e 22 2c 20 70  f(&acc, "%Q.", p
11e50 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a  Csr->azArg[1]);.
11e60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
11e70 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26  AccumAppendAll(&
11e80 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65  acc, pTab->pName
11e90 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
11ea0 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29  pCsr->azArg[0] )
11eb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
11ec0 69 6e 74 66 28 26 61 63 63 2c 20 22 3d 25 51 22  intf(&acc, "=%Q"
11ed0 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d  , pCsr->azArg[0]
11ee0 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  );.  }.  zSql = 
11ef0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
11f00 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 69  inish(&acc);.  i
11f10 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
11f20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11f30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11f40 5f 70 72 65 70 61 72 65 5f 76 32 28 70 54 61 62  _prepare_v2(pTab
11f50 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
11f60 26 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20  &pCsr->pPragma, 
11f70 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
11f80 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ee(zSql);.  if( 
11f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11fa0 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e  .    pTab->base.
11fb0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
11fc0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
11fd0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
11fe0 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72  Tab->db));.    r
11ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
12000 72 65 74 75 72 6e 20 70 72 61 67 6d 61 56 74 61  return pragmaVta
12010 62 4e 65 78 74 28 70 56 74 61 62 43 75 72 73 6f  bNext(pVtabCurso
12020 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61  r);.}../*.** Pra
12030 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
12040 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65  e module xEof me
12050 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
12060 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 45 6f  int pragmaVtabEo
12070 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f(sqlite3_vtab_c
12080 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
12090 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  or){.  PragmaVta
120a0 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
120b0 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
120c0 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
120d0 20 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e    return (pCsr->
120e0 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a  pPragma==0);.}..
120f0 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d  /* The xColumn m
12100 65 74 68 6f 64 20 73 69 6d 70 6c 79 20 72 65 74  ethod simply ret
12110 75 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70  urns the corresp
12120 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72  onding column fr
12130 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d 41  om.** the PRAGMA
12140 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
12150 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75  t pragmaVtabColu
12160 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  mn(.  sqlite3_vt
12170 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
12180 43 75 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74  Cursor, .  sqlit
12190 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
121a0 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50   .  int i.){.  P
121b0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
121c0 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
121d0 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62  tabCursor*)pVtab
121e0 43 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61  Cursor;.  Pragma
121f0 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72  Vtab *pTab = (Pr
12200 61 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62  agmaVtab*)(pVtab
12210 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a  Cursor->pVtab);.
12220 20 20 69 66 28 20 69 3c 70 54 61 62 2d 3e 69 48    if( i<pTab->iH
12230 69 64 64 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  idden ){.    sql
12240 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
12250 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63  e(ctx, sqlite3_c
12260 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72  olumn_value(pCsr
12270 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a  ->pPragma, i));.
12280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
12290 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
122a0 28 63 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72  (ctx, pCsr->azAr
122b0 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69 64 64 65  g[i-pTab->iHidde
122c0 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41  n],-1,SQLITE_TRA
122d0 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72  NSIENT);.  }.  r
122e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
122f0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d  .}../* .** Pragm
12300 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
12310 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64 20 6d 65  module xRowid me
12320 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
12330 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 52 6f  int pragmaVtabRo
12340 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
12350 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
12360 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74  rsor, sqlite_int
12370 36 34 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61  64 *p){.  Pragma
12380 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
12390 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
123a0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
123b0 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e  r;.  *p = pCsr->
123c0 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e  iRowid;.  return
123d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
123e0 2a 20 54 68 65 20 70 72 61 67 6d 61 20 76 69 72  * The pragma vir
123f0 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63  tual table objec
12400 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  t */.static cons
12410 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
12420 20 70 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c   pragmaVtabModul
12430 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20  e = {.  0,      
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
12460 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20     /* xCreate - 
12490 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a  create a table *
124a0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f  /.  pragmaVtabCo
124b0 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
124c0 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63   /* xConnect - c
124d0 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69  onnect to an exi
124e0 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  sting table */. 
124f0 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49   pragmaVtabBestI
12500 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a  ndex,         /*
12510 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20 44 65   xBestIndex - De
12520 74 65 72 6d 69 6e 65 20 73 65 61 72 63 68 20 73  termine search s
12530 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 70 72 61  trategy */.  pra
12540 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  gmaVtabDisconnec
12550 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69  t,        /* xDi
12560 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f  sconnect - Disco
12570 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20 74 61 62  nnect from a tab
12580 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  le */.  0,      
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79       /* xDestroy
125b0 20 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65 20   - Drop a table 
125c0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4f  */.  pragmaVtabO
125d0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
125e0 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65    /* xOpen - ope
125f0 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  n a cursor */.  
12600 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c  pragmaVtabClose,
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12620 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61  xClose - close a
12630 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61   cursor */.  pra
12640 67 6d 61 56 74 61 62 46 69 6c 74 65 72 2c 20 20  gmaVtabFilter,  
12650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
12660 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65  lter - configure
12670 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74   scan constraint
12680 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  s */.  pragmaVta
12690 62 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  bNext,          
126a0 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
126b0 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
126c0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 45  */.  pragmaVtabE
126d0 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  of,             
126e0 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70    /* xEof */.  p
126f0 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c  ragmaVtabColumn,
12700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
12710 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61  Column - read da
12720 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  ta */.  pragmaVt
12730 61 62 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  abRowid,        
12740 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
12750 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
12760 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12780 78 55 70 64 61 74 65 20 2d 20 77 72 69 74 65 20  xUpdate - write 
12790 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20  data */.  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 2f 2a 20 78 42 65 67 69 6e         /* xBegin
127c0 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63   - begin transac
127d0 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  tion */.  0,    
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
12800 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69  - sync transacti
12810 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
12840 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63  - commit transac
12850 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  tion */.  0,    
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
12880 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74  ack - rollback t
12890 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
128a0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
128c0 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20  xFindFunction - 
128d0 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
128e0 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20  ding */.  0,    
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
12910 65 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 74  e - rename the t
12920 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  able */.  0,    
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70         /* xSavep
12950 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  oint */.  0,    
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61         /* xRelea
12980 73 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  se */.  0       
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
129b0 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  kTo */.};../*.**
129c0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
129d0 20 7a 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61   zTabName is rea
129e0 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lly the name of 
129f0 61 20 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74  a pragma.  If it
12a00 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67   is,.** then reg
12a10 69 73 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f  ister an eponymo
12a20 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
12a30 20 66 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61   for that pragma
12a40 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
12a50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12a60 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f  Module object fo
12a70 72 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61  r the new virtua
12a80 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75  l table..*/.Modu
12a90 6c 65 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d  le *sqlite3Pragm
12aa0 61 56 74 61 62 52 65 67 69 73 74 65 72 28 73 71  aVtabRegister(sq
12ab0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
12ac0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
12ad0 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
12ae0 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65  e *pName;.  asse
12af0 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  rt( sqlite3_strn
12b00 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61  icmp(zName, "pra
12b10 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a  gma_", 7)==0 );.
12b20 20 20 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61    pName = pragma
12b30 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b  Locate(zName+7);
12b40 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20  .  if( pName==0 
12b50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12b60 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46  ( (pName->mPragF
12b70 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65  lg & (PragFlg_Re
12b80 73 75 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65  sult0|PragFlg_Re
12b90 73 75 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74  sult1))==0 ) ret
12ba0 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
12bb0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
12bc0 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a  (&db->aModule, z
12bd0 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Name)==0 );.  re
12be0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62  turn sqlite3Vtab
12bf0 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c  CreateModule(db,
12c00 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56   zName, &pragmaV
12c10 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64  tabModule, (void
12c20 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a  *)pName, 0);.}..
12c30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12c40 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12c50 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  LE */..#endif /*
12c60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
12c70 47 4d 41 20 2a 2f 0a                             GMA */.