/ Hex Artifact Content
Login

Artifact 41f18267db44df49756c3c3cdc695e701e169a63:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 2c 20   upr, lwr, mid, 
2260: 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20  rc;.  lwr = 0;. 
2270: 20 75 70 72 20 3d 20 41 72 72 61 79 53 69 7a 65   upr = ArraySize
2280: 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 2d 31 3b  (aPragmaName)-1;
2290: 0a 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75  .  while( lwr<=u
22a0: 70 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20  pr ){.    mid = 
22b0: 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20  (lwr+upr)/2;.   
22c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
22d0: 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 50 72  ricmp(zName, aPr
22e0: 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d 2e 7a 4e  agmaName[mid].zN
22f0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
2300: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2310: 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
2320: 20 20 20 75 70 72 20 3d 20 6d 69 64 20 2d 20 31     upr = mid - 1
2330: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2340: 20 20 20 6c 77 72 20 3d 20 6d 69 64 20 2b 20 31     lwr = mid + 1
2350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2360: 74 75 72 6e 20 6c 77 72 3e 75 70 72 20 3f 20 30  turn lwr>upr ? 0
2370: 20 3a 20 26 61 50 72 61 67 6d 61 4e 61 6d 65 5b   : &aPragmaName[
2380: 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  mid];.}../*.** P
2390: 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20  rocess a pragma 
23a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
23b0: 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f  ** Pragmas are o
23c0: 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a  f this form:.**.
23d0: 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 5b  **      PRAGMA [
23e0: 73 63 68 65 6d 61 2e 5d 69 64 20 5b 3d 20 76 61  schema.]id [= va
23f0: 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lue].**.** The i
2400: 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74 20  dentifier might 
2410: 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e 67  also be a string
2420: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  .  The value is 
2430: 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a  a string, and.**
2440: 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20   identifier, or 
2450: 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d 69  a number.  If mi
2460: 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65 2c  nusFlag is true,
2470: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
2480: 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74  is.** a number t
2490: 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65 64  hat was preceded
24a0: 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e   by a minus sign
24b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
24c0: 65 66 74 20 73 69 64 65 20 69 73 20 22 64 61 74  eft side is "dat
24d0: 61 62 61 73 65 2e 69 64 22 20 74 68 65 6e 20 70  abase.id" then p
24e0: 49 64 31 20 69 73 20 74 68 65 20 64 61 74 61 62  Id1 is the datab
24f0: 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 61 6e 64 20  ase name.** and 
2500: 70 49 64 32 20 69 73 20 74 68 65 20 69 64 2e 20  pId2 is the id. 
2510: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
2520: 65 20 69 73 20 6a 75 73 74 20 22 69 64 22 20 74  e is just "id" t
2530: 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65 0a  hen pId1 is the.
2540: 2a 2a 20 69 64 20 61 6e 64 20 70 49 64 32 20 69  ** id and pId2 i
2550: 73 20 61 6e 79 20 65 6d 70 74 79 20 73 74 72 69  s any empty stri
2560: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
2570: 74 65 33 50 72 61 67 6d 61 28 0a 20 20 50 61 72  te3Pragma(.  Par
2580: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 54  se *pParse, .  T
2590: 6f 6b 65 6e 20 2a 70 49 64 31 2c 20 20 20 20 20  oken *pId1,     
25a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
25b0: 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20   of [schema.]id 
25c0: 66 69 65 6c 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  field */.  Token
25d0: 20 2a 70 49 64 32 2c 20 20 20 20 20 20 20 20 2f   *pId2,        /
25e0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
25f0: 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20 66 69 65   [schema.]id fie
2600: 6c 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ld, or NULL */. 
2610: 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 75 65 2c 20   Token *pValue, 
2620: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 66 6f       /* Token fo
2630: 72 20 3c 76 61 6c 75 65 3e 2c 20 6f 72 20 4e 55  r <value>, or NU
2640: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 75  LL */.  int minu
2650: 73 46 6c 61 67 20 20 20 20 20 20 20 2f 2a 20 54  sFlag       /* T
2660: 72 75 65 20 69 66 20 61 20 27 2d 27 20 73 69 67  rue if a '-' sig
2670: 6e 20 70 72 65 63 65 64 65 64 20 3c 76 61 6c 75  n preceded <valu
2680: 65 3e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  e> */.){.  char 
2690: 2a 7a 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *zLeft = 0;     
26a0: 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
26b0: 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67  ted UTF-8 string
26c0: 20 3c 69 64 3e 20 2a 2f 0a 20 20 63 68 61 72 20   <id> */.  char 
26d0: 2a 7a 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  *zRight = 0;    
26e0: 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
26f0: 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67  ted UTF-8 string
2700: 20 3c 76 61 6c 75 65 3e 2c 20 6f 72 20 4e 55 4c   <value>, or NUL
2710: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
2720: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a  r *zDb = 0;   /*
2730: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   The database na
2740: 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  me */.  Token *p
2750: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
2760: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 3c 69 64  * Pointer to <id
2770: 3e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 63 68 61  > token */.  cha
2780: 72 20 2a 61 46 63 6e 74 6c 5b 34 5d 3b 20 20 20  r *aFcntl[4];   
2790: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
27a0: 74 6f 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  to SQLITE_FCNTL_
27b0: 50 52 41 47 4d 41 20 2a 2f 0a 20 20 69 6e 74 20  PRAGMA */.  int 
27c0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
27d0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
27e0: 6e 64 65 78 20 66 6f 72 20 3c 64 61 74 61 62 61  ndex for <databa
27f0: 73 65 3e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  se> */.  int rc;
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
2820: 76 61 6c 75 65 20 66 6f 72 6d 20 53 51 4c 49 54  value form SQLIT
2830: 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a  E_FCNTL_PRAGMA *
2840: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
2850: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
2860: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2870: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2880: 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a0: 20 54 68 65 20 73 70 65 63 69 66 69 63 20 64 61   The specific da
28b0: 74 61 62 61 73 65 20 62 65 69 6e 67 20 70 72 61  tabase being pra
28c0: 67 6d 61 65 64 20 2a 2f 0a 20 20 56 64 62 65 20  gmaed */.  Vdbe 
28d0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
28e0: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 2f 2a  dbe(pParse);  /*
28f0: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
2900: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50  ent */.  const P
2910: 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61 67  ragmaName *pPrag
2920: 6d 61 3b 20 20 20 2f 2a 20 54 68 65 20 70 72 61  ma;   /* The pra
2930: 67 6d 61 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d  gma */..  if( v=
2940: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
2950: 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c  qlite3VdbeRunOnl
2960: 79 4f 6e 63 65 28 76 29 3b 0a 20 20 70 50 61 72  yOnce(v);.  pPar
2970: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 0a 20  se->nMem = 2;.. 
2980: 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68   /* Interpret th
2990: 65 20 5b 73 63 68 65 6d 61 2e 5d 20 70 61 72 74  e [schema.] part
29a0: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 73   of the pragma s
29b0: 74 61 74 65 6d 65 6e 74 2e 20 69 44 62 20 69 73  tatement. iDb is
29c0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
29d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
29e0: 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20 62  this pragma is b
29f0: 65 69 6e 67 20 61 70 70 6c 69 65 64 20 74 6f 20  eing applied to 
2a00: 69 6e 20 64 62 2e 61 44 62 5b 5d 2e 20 2a 2f 0a  in db.aDb[]. */.
2a10: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
2a20: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
2a30: 65 2c 20 70 49 64 31 2c 20 70 49 64 32 2c 20 26  e, pId1, pId2, &
2a40: 70 49 64 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  pId);.  if( iDb<
2a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 44  0 ) return;.  pD
2a60: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
2a70: 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ];..  /* If the 
2a80: 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 68 61  temp database ha
2a90: 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  s been explicitl
2aa0: 79 20 6e 61 6d 65 64 20 61 73 20 70 61 72 74 20  y named as part 
2ab0: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 72 61  of the .  ** pra
2ac0: 67 6d 61 2c 20 6d 61 6b 65 20 73 75 72 65 20 69  gma, make sure i
2ad0: 74 20 69 73 20 6f 70 65 6e 2e 20 0a 20 20 2a 2f  t is open. .  */
2ae0: 0a 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26  .  if( iDb==1 &&
2af0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
2b00: 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29  Database(pParse)
2b10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
2b20: 20 20 7d 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73    }..  zLeft = s
2b30: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
2b40: 6b 65 6e 28 64 62 2c 20 70 49 64 29 3b 0a 20 20  ken(db, pId);.  
2b50: 69 66 28 20 21 7a 4c 65 66 74 20 29 20 72 65 74  if( !zLeft ) ret
2b60: 75 72 6e 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  urn;.  if( minus
2b70: 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69 67  Flag ){.    zRig
2b80: 68 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ht = sqlite3MPri
2b90: 6e 74 66 28 64 62 2c 20 22 2d 25 54 22 2c 20 70  ntf(db, "-%T", p
2ba0: 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Value);.  }else{
2bb0: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2bc0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
2bd0: 65 6e 28 64 62 2c 20 70 56 61 6c 75 65 29 3b 0a  en(db, pValue);.
2be0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
2bf0: 49 64 32 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70  Id2 );.  zDb = p
2c00: 49 64 32 2d 3e 6e 3e 30 20 3f 20 70 44 62 2d 3e  Id2->n>0 ? pDb->
2c10: 7a 44 62 53 4e 61 6d 65 20 3a 20 30 3b 0a 20 20  zDbSName : 0;.  
2c20: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
2c30: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2c40: 49 54 45 5f 50 52 41 47 4d 41 2c 20 7a 4c 65 66  ITE_PRAGMA, zLef
2c50: 74 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 20  t, zRight, zDb) 
2c60: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67  ){.    goto prag
2c70: 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ma_out;.  }..  /
2c80: 2a 20 53 65 6e 64 20 61 6e 20 53 51 4c 49 54 45  * Send an SQLITE
2c90: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2ca0: 6c 65 2d 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  le-control to th
2cb0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53  e underlying VFS
2cc0: 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  .  ** connection
2cd0: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
2ce0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
2cf0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2d00: 20 56 46 53 0a 20 20 2a 2a 20 68 61 6e 64 6c 65   VFS.  ** handle
2d10: 64 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64  d the pragma and
2d20: 20 67 65 6e 65 72 61 74 65 20 61 20 6e 6f 2d 6f   generate a no-o
2d30: 70 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  p prepared state
2d40: 6d 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ment..  **.  ** 
2d50: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
2d60: 46 3a 20 52 2d 31 32 32 33 38 2d 35 35 31 32 30  F: R-12238-55120
2d70: 20 57 68 65 6e 65 76 65 72 20 61 20 50 52 41 47   Whenever a PRAG
2d80: 4d 41 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  MA statement is 
2d90: 70 61 72 73 65 64 2c 0a 20 20 2a 2a 20 61 6e 20  parsed,.  ** an 
2da0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2db0: 47 4d 41 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c  GMA file control
2dc0: 20 69 73 20 73 65 6e 74 20 74 6f 20 74 68 65 20   is sent to the 
2dd0: 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  open sqlite3_fil
2de0: 65 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 63 6f  e.  ** object co
2df0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
2e00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e10: 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 70 72   to which the pr
2e20: 61 67 6d 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  agma.  ** statem
2e30: 65 6e 74 20 72 65 66 65 72 73 2e 0a 20 20 2a 2a  ent refers..  **
2e40: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2e50: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 39 38 37 35  TION-OF: R-29875
2e60: 2d 33 31 36 37 38 20 54 68 65 20 61 72 67 75 6d  -31678 The argum
2e70: 65 6e 74 20 74 6f 20 74 68 65 20 53 51 4c 49 54  ent to the SQLIT
2e80: 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 0a 20  E_FCNTL_PRAGMA. 
2e90: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c   ** file control
2ea0: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
2eb0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
2ec0: 6e 67 73 20 28 63 68 61 72 2a 2a 29 20 69 6e 20  ngs (char**) in 
2ed0: 77 68 69 63 68 20 74 68 65 0a 20 20 2a 2a 20 73  which the.  ** s
2ee0: 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66  econd element of
2ef0: 20 74 68 65 20 61 72 72 61 79 20 69 73 20 74 68   the array is th
2f00: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  e name of the pr
2f10: 61 67 6d 61 20 61 6e 64 20 74 68 65 20 74 68 69  agma and the thi
2f20: 72 64 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 20  rd.  ** element 
2f30: 69 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  is the argument 
2f40: 74 6f 20 74 68 65 20 70 72 61 67 6d 61 20 6f 72  to the pragma or
2f50: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 61   NULL if the pra
2f60: 67 6d 61 20 68 61 73 20 6e 6f 0a 20 20 2a 2a 20  gma has no.  ** 
2f70: 61 72 67 75 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  argument..  */. 
2f80: 20 61 46 63 6e 74 6c 5b 30 5d 20 3d 20 30 3b 0a   aFcntl[0] = 0;.
2f90: 20 20 61 46 63 6e 74 6c 5b 31 5d 20 3d 20 7a 4c    aFcntl[1] = zL
2fa0: 65 66 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 32 5d  eft;.  aFcntl[2]
2fb0: 20 3d 20 7a 52 69 67 68 74 3b 0a 20 20 61 46 63   = zRight;.  aFc
2fc0: 6e 74 6c 5b 33 5d 20 3d 20 30 3b 0a 20 20 64 62  ntl[3] = 0;.  db
2fd0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
2fe0: 75 73 79 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  usy = 0;.  rc = 
2ff0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
3000: 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51  trol(db, zDb, SQ
3010: 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d  LITE_FCNTL_PRAGM
3020: 41 2c 20 28 76 6f 69 64 2a 29 61 46 63 6e 74 6c  A, (void*)aFcntl
3030: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
3040: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
3050: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
3060: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73  ols(v, 1);.    s
3070: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
3080: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
3090: 4d 45 5f 4e 41 4d 45 2c 20 61 46 63 6e 74 6c 5b  ME_NAME, aFcntl[
30a0: 30 5d 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  0], SQLITE_TRANS
30b0: 49 45 4e 54 29 3b 0a 20 20 20 20 72 65 74 75 72  IENT);.    retur
30c0: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 61  nSingleText(v, a
30d0: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 73  Fcntl[0]);.    s
30e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
30f0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 67 6f 74 6f  tl[0]);.    goto
3100: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d   pragma_out;.  }
3110: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3120: 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
3130: 20 20 69 66 28 20 61 46 63 6e 74 6c 5b 30 5d 20    if( aFcntl[0] 
3140: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3150: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3160: 20 22 25 73 22 2c 20 61 46 63 6e 74 6c 5b 30 5d   "%s", aFcntl[0]
3170: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3180: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
31a0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
31b0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
31c0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
31d0: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
31e0: 4c 6f 63 61 74 65 20 74 68 65 20 70 72 61 67 6d  Locate the pragm
31f0: 61 20 69 6e 20 74 68 65 20 6c 6f 6f 6b 75 70 20  a in the lookup 
3200: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 50 72 61 67  table */.  pPrag
3210: 6d 61 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61 74  ma = pragmaLocat
3220: 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  e(zLeft);.  if( 
3230: 70 50 72 61 67 6d 61 3d 3d 30 20 29 20 67 6f 74  pPragma==0 ) got
3240: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 0a 20  o pragma_out;.. 
3250: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
3260: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
3270: 61 20 69 73 20 6c 6f 61 64 65 64 20 69 66 20 74  a is loaded if t
3280: 68 65 20 70 72 61 67 6d 61 20 72 65 71 75 69 72  he pragma requir
3290: 65 73 20 74 68 61 74 20 2a 2f 0a 20 20 69 66 28  es that */.  if(
32a0: 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
32b0: 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 65  Flg & PragFlg_Ne
32c0: 65 64 53 63 68 65 6d 61 29 21 3d 30 20 29 7b 0a  edSchema)!=0 ){.
32d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
32e0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
32f0: 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f  ) ) goto pragma_
3300: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  out;.  }..  /* R
3310: 65 67 69 73 74 65 72 20 74 68 65 20 72 65 73 75  egister the resu
3320: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
3330: 66 6f 72 20 70 72 61 67 6d 61 73 20 74 68 61 74  for pragmas that
3340: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 73 20   return results 
3350: 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d  */.  if( (pPragm
3360: 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
3370: 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 29  agFlg_NoColumns)
3380: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 74 50 72  ==0 ){.    setPr
3390: 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e  agmaResultColumn
33a0: 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61  Names(v, pPragma
33b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
33c0: 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  p to the appropr
33d0: 69 61 74 65 20 70 72 61 67 6d 61 20 68 61 6e 64  iate pragma hand
33e0: 6c 65 72 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ler */.  switch(
33f0: 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54   pPragma->ePragT
3400: 79 70 20 29 7b 0a 20 20 0a 23 69 66 20 21 64 65  yp ){.  .#if !de
3410: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3420: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
3430: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
3440: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
3450: 54 45 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TED).  /*.  **  
3460: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
3470: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
3480: 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
3490: 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74  [schema.]default
34a0: 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20  _cache_size=N.  
34b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
34c0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
34d0: 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69  he current persi
34e0: 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  stent setting fo
34f0: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
3500: 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65  cache size.  The
3510: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
3520: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
3530: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
3540: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
3550: 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
3560: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74  nd form sets bot
3570: 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  h the current.  
3580: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
3590: 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  ze value and the
35a0: 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65   persistent page
35b0: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
35c0: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
35d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35e0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c  le..  **.  ** Ol
35f0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
3600: 53 51 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74  SQLite would set
3610: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63   the default cac
3620: 68 65 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a  he size to a.  *
3630: 2a 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  * negative numbe
3640: 72 20 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79  r to indicate sy
3650: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20  nchronous=OFF.  
3660: 54 68 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63  These days, sync
3670: 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20  hronous.  ** is 
3680: 61 6c 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66  always on by def
3690: 61 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20  ault regardless 
36a0: 6f 66 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74  of the sign of t
36b0: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
36c0: 0a 20 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74  .  ** size.  But
36d0: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b   continue to tak
36e0: 65 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  e the absolute v
36f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 64 65 66 61  alue of the defa
3700: 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73  ult cache.  ** s
3710: 69 7a 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61  ize of historica
3720: 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
3730: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
3740: 67 54 79 70 5f 44 45 46 41 55 4c 54 5f 43 41 43  gTyp_DEFAULT_CAC
3750: 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73  HE_SIZE: {.    s
3760: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
3770: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
3780: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
3790: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
37a0: 62 65 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68  beOpList getCach
37b0: 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eSize[] = {.    
37c0: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
37d0: 6f 6e 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  on, 0, 0,       
37e0: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3800: 30 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0 */.      { OP_
3810: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  ReadCookie,  0, 
3820: 31 2c 20 20 20 20 20 20 20 20 42 54 52 45 45 5f  1,        BTREE_
3830: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3840: 5a 45 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  ZE},  /* 1 */.  
3850: 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20      { OP_IfPos, 
3860: 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20        1, 8,     
3870: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
3880: 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30  P_Integer,     0
3890: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
38a0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72        { OP_Subtr
38b0: 61 63 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20  act,    1, 2,   
38c0: 20 20 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b       1},.      {
38d0: 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20   OP_IfPos,      
38e0: 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d   1, 8,        0}
38f0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
3900: 65 67 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20  eger,     0, 1, 
3910: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20         0},      
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20     /* 6 */.     
3940: 20 7b 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20   { OP_Noop,     
3950: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
3960: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
3970: 65 73 75 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31  esultRow,   1, 1
3980: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3990: 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   };.    VdbeOp *
39a0: 61 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  aOp;.    sqlite3
39b0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
39c0: 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
39d0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
39e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
39f0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
3a00: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
3a10: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
3a20: 72 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65  raySize(getCache
3a30: 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 61 4f  Size));.      aO
3a40: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
3a50: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
3a60: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
3a70: 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a  ze), getCacheSiz
3a80: 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69  e, iLn);.      i
3a90: 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c  f( ONLY_IF_REALL
3aa0: 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30  OC_STRESS(aOp==0
3ab0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
3ac0: 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62   aOp[0].p1 = iDb
3ad0: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
3ae0: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
3af0: 4f 70 5b 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54  Op[6].p1 = SQLIT
3b00: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
3b10: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  SIZE;.    }else{
3b20: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
3b30: 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
3b40: 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  2(sqlite3Atoi(zR
3b50: 69 67 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71  ight));.      sq
3b60: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
3b70: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
3b80: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
3b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ba0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
3bb0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 44 45  e, iDb, BTREE_DE
3bc0: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3bd0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61  , size);.      a
3be0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
3bf0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
3c00: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
3c10: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
3c20: 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69  >cache_size = si
3c30: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
3c40: 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
3c50: 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62  ze(pDb->pBt, pDb
3c60: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3c70: 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
3c80: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
3c90: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
3ca0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3cb0: 53 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  S && !SQLITE_OMI
3cc0: 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a  T_DEPRECATED */.
3cd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
3ce0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3cf0: 50 52 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20  PRAGMAS).  /*.  
3d00: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
3d10: 6d 61 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20  ma.]page_size.  
3d20: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
3d30: 6d 61 2e 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a  ma.]page_size=N.
3d40: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
3d50: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
3d60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
3d70: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
3d80: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
3d90: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20  size in bytes.  
3da0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
3db0: 73 65 74 73 20 74 68 65 0a 20 20 2a 2a 20 64 61  sets the.  ** da
3dc0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
3dd0: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 76 61 6c   value.  The val
3de0: 75 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73  ue can only be s
3df0: 65 74 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 64  et if.  ** the d
3e00: 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20  atabase has not 
3e10: 79 65 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  yet been created
3e20: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
3e30: 61 67 54 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a  agTyp_PAGE_SIZE:
3e40: 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42   {.    Btree *pB
3e50: 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20  t = pDb->pBt;.  
3e60: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
3e70: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   );.    if( !zRi
3e80: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ght ){.      int
3e90: 20 73 69 7a 65 20 3d 20 41 4c 57 41 59 53 28 70   size = ALWAYS(p
3ea0: 42 74 29 20 3f 20 73 71 6c 69 74 65 33 42 74 72  Bt) ? sqlite3Btr
3eb0: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeGetPageSize(pB
3ec0: 74 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 72 65  t) : 0;.      re
3ed0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
3ee0: 20 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73   size);.    }els
3ef0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  e{.      /* Mall
3f00: 6f 63 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e  oc may fail when
3f10: 20 73 65 74 74 69 6e 67 20 74 68 65 20 70 61 67   setting the pag
3f20: 65 2d 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65  e-size, as there
3f30: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a   is an internal.
3f40: 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
3f50: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
3f60: 6f 64 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73  odule resizes us
3f70: 69 6e 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  ing sqlite3_real
3f80: 6c 6f 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loc()..      */.
3f90: 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61        db->nextPa
3fa0: 67 65 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  gesize = sqlite3
3fb0: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
3fc0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
3fd0: 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
3fe0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
3ff0: 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
4000: 69 7a 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20  ize,-1,0) ){.   
4010: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
4020: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
4030: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
4040: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
4050: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4060: 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65  a.]secure_delete
4070: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
4080: 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65  chema.]secure_de
4090: 6c 65 74 65 3d 4f 4e 2f 4f 46 46 0a 20 20 2a 2a  lete=ON/OFF.  **
40a0: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
40b0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
40c0: 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
40d0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 65   for the.  ** se
40e0: 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c 61 67  cure_delete flag
40f0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
4100: 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 73  rm changes the s
4110: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a  ecure_delete.  *
4120: 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67 20 61  * flag setting a
4130: 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65 6e 65  nd reports thene
4140: 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  w value..  */.  
4150: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 45 43  case PragTyp_SEC
4160: 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20  URE_DELETE: {.  
4170: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
4180: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 69 6e 74  Db->pBt;.    int
4190: 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73   b = -1;.    ass
41a0: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
41b0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
41c0: 0a 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74  .      b = sqlit
41d0: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
41e0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ght, 0);.    }. 
41f0: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
4200: 30 20 26 26 20 62 3e 3d 30 20 29 7b 0a 20 20 20  0 && b>=0 ){.   
4210: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
4220: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62   for(ii=0; ii<db
4230: 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20  ->nDb; ii++){.  
4240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
4250: 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 64  eeSecureDelete(d
4260: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20  b->aDb[ii].pBt, 
4270: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4280: 7d 0a 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65  }.    b = sqlite
4290: 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
42a0: 74 65 28 70 42 74 2c 20 62 29 3b 0a 20 20 20 20  te(pBt, b);.    
42b0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
42c0: 76 2c 20 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  v, b);.    break
42d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
42e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
42f0: 2e 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  .]max_page_count
4300: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
4310: 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f  chema.]max_page_
4320: 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  count=N.  **.  *
4330: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
4340: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
4350: 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72  rent setting for
4360: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d 75   the.  ** maximu
4370: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
4380: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
4390: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 0a 20 20  e file.  The .  
43a0: 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 61  ** second form a
43b0: 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61 6e 67  ttempts to chang
43c0: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 20  e this setting. 
43d0: 20 42 6f 74 68 0a 20 20 2a 2a 20 66 6f 72 6d 73   Both.  ** forms
43e0: 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
43f0: 65 6e 74 20 73 65 74 74 69 6e 67 2e 0a 20 20 2a  ent setting..  *
4400: 2a 0a 20 20 2a 2a 20 54 68 65 20 61 62 73 6f 6c  *.  ** The absol
4410: 75 74 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 69  ute value of N i
4420: 73 20 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  s used.  This is
4430: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 61 6e   undocumented an
4440: 64 20 6d 69 67 68 74 0a 20 20 2a 2a 20 63 68 61  d might.  ** cha
4450: 6e 67 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 70  nge.  The only p
4460: 75 72 70 6f 73 65 20 69 73 20 74 6f 20 70 72 6f  urpose is to pro
4470: 76 69 64 65 20 61 6e 20 65 61 73 79 20 77 61 79  vide an easy way
4480: 20 74 6f 20 74 65 73 74 0a 20 20 2a 2a 20 74 68   to test.  ** th
4490: 65 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  e sqlite3AbsInt3
44a0: 32 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  2() function..  
44b0: 2a 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  **.  **  PRAGMA 
44c0: 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 63 6f  [schema.]page_co
44d0: 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  unt.  **.  ** Re
44e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
44f0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4500: 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61  specified databa
4510: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
4520: 50 72 61 67 54 79 70 5f 50 41 47 45 5f 43 4f 55  PragTyp_PAGE_COU
4530: 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 52  NT: {.    int iR
4540: 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  eg;.    sqlite3C
4550: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
4560: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
4570: 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73    iReg = ++pPars
4580: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
4590: 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28   sqlite3Tolower(
45a0: 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 70 27 20 29  zLeft[0])=='p' )
45b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
45c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
45d0: 50 61 67 65 63 6f 75 6e 74 2c 20 69 44 62 2c 20  Pagecount, iDb, 
45e0: 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
45f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4600: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4610: 4d 61 78 50 67 63 6e 74 2c 20 69 44 62 2c 20 69  MaxPgcnt, iDb, i
4620: 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Reg, .          
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4640: 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73 71  lite3AbsInt32(sq
4650: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
4660: 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  )));.    }.    s
4670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4680: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
4690: 2c 20 69 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  , iReg, 1);.    
46a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
46b0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
46c0: 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d  chema.]locking_m
46d0: 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ode.  **  PRAGMA
46e0: 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e   [schema.]lockin
46f0: 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f 72 6d 61 6c  g_mode = (normal
4700: 7c 65 78 63 6c 75 73 69 76 65 29 0a 20 20 2a 2f  |exclusive).  */
4710: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4720: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3a 20 7b 0a  LOCKING_MODE: {.
4730: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4740: 7a 52 65 74 20 3d 20 22 6e 6f 72 6d 61 6c 22 3b  zRet = "normal";
4750: 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d  .    int eMode =
4760: 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28   getLockingMode(
4770: 7a 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 69 66  zRight);..    if
4780: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20  ( pId2->n==0 && 
4790: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
47a0: 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 20 29  KINGMODE_QUERY )
47b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6d 70 6c  {.      /* Simpl
47c0: 65 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  e "PRAGMA lockin
47d0: 67 5f 6d 6f 64 65 3b 22 20 73 74 61 74 65 6d 65  g_mode;" stateme
47e0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 71 75  nt. This is a qu
47f0: 65 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ery for.      **
4800: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 65 66   the current def
4810: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  ault locking mod
4820: 65 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  e (which may be 
4830: 64 69 66 66 65 72 65 6e 74 20 74 6f 0a 20 20 20  different to.   
4840: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e     ** the lockin
4850: 67 2d 6d 6f 64 65 20 6f 66 20 74 68 65 20 6d 61  g-mode of the ma
4860: 69 6e 20 64 61 74 61 62 61 73 65 29 2e 0a 20 20  in database)..  
4870: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65 4d 6f      */.      eMo
4880: 64 65 20 3d 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  de = db->dfltLoc
4890: 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65  kMode;.    }else
48a0: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
48b0: 50 61 67 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Pager;.      if(
48c0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pId2->n==0 ){. 
48d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
48e0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6e 6f  ndicates that no
48f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 77   database name w
4900: 61 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  as specified as 
4910: 70 61 72 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  part.        ** 
4920: 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 63 6f  of the PRAGMA co
4930: 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 69 73 20 63  mmand. In this c
4940: 61 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  ase the locking-
4950: 6d 6f 64 65 20 6d 75 73 74 20 62 65 0a 20 20 20  mode must be.   
4960: 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 61       ** set on a
4970: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
4980: 62 61 73 65 73 2c 20 61 73 20 77 65 6c 6c 20 61  bases, as well a
4990: 73 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66 69  s the main db fi
49a0: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  le..        **. 
49b0: 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20         ** Also, 
49c0: 74 68 65 20 73 71 6c 69 74 65 33 2e 64 66 6c 74  the sqlite3.dflt
49d0: 4c 6f 63 6b 4d 6f 64 65 20 76 61 72 69 61 62 6c  LockMode variabl
49e0: 65 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  e is set so that
49f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
4a00: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 61 74 74  subsequently att
4a10: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
4a20: 61 6c 73 6f 20 75 73 65 20 74 68 65 20 73 70 65  also use the spe
4a30: 63 69 66 69 65 64 0a 20 20 20 20 20 20 20 20 2a  cified.        *
4a40: 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  * locking mode..
4a50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4a60: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
4a70: 20 20 20 61 73 73 65 72 74 28 70 44 62 3d 3d 26     assert(pDb==&
4a80: 64 62 2d 3e 61 44 62 5b 30 5d 29 3b 0a 20 20 20  db->aDb[0]);.   
4a90: 20 20 20 20 20 66 6f 72 28 69 69 3d 32 3b 20 69       for(ii=2; i
4aa0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29  i<db->nDb; ii++)
4ab0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
4ac0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
4ad0: 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69  ePager(db->aDb[i
4ae0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 20  i].pBt);.       
4af0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
4b00: 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67 65  ockingMode(pPage
4b10: 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
4b20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d     }.        db-
4b30: 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20  >dfltLockMode = 
4b40: 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20 20 20  (u8)eMode;.     
4b50: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 20   }.      pPager 
4b60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
4b70: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
4b80: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 73 71 6c       eMode = sql
4b90: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4ba0: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4bb0: 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  de);.    }..    
4bc0: 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
4bd0: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
4be0: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
4bf0: 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
4c00: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
4c10: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20  EXCLUSIVE );.   
4c20: 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45   if( eMode==PAGE
4c30: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
4c40: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
4c50: 20 7a 52 65 74 20 3d 20 22 65 78 63 6c 75 73 69   zRet = "exclusi
4c60: 76 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ve";.    }.    r
4c70: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
4c80: 76 2c 20 7a 52 65 74 29 3b 0a 20 20 20 20 62 72  v, zRet);.    br
4c90: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
4ca0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
4cb0: 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  ema.]journal_mod
4cc0: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  e.  **  PRAGMA [
4cd0: 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f  schema.]journal_
4ce0: 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20 20 20  mode =.  **     
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69 73 74   (delete|persist
4d10: 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c 6d 65  |off|truncate|me
4d20: 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a 20 20  mory|wal|off).  
4d30: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4d40: 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f 44 45 3a 20  p_JOURNAL_MODE: 
4d50: 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 3b  {.    int eMode;
4d60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
4d70: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
4d80: 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79 6d 62  NALMODE_XXX symb
4d90: 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ols */.    int i
4da0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;           /* 
4db0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
4dc0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
4dd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
4de0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22 3d  f there is no "=
4df0: 4d 4f 44 45 22 20 70 61 72 74 20 6f 66 20 74 68  MODE" part of th
4e00: 65 20 70 72 61 67 6d 61 2c 20 64 6f 20 61 20 71  e pragma, do a q
4e10: 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20 20  uery for the.   
4e20: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6d 6f     ** current mo
4e30: 64 65 20 2a 2f 0a 20 20 20 20 20 20 65 4d 6f 64  de */.      eMod
4e40: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
4e50: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
4e60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
4e70: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 3b  nst char *zMode;
4e80: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
4e90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4ea0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 66 6f  Right);.      fo
4eb0: 72 28 65 4d 6f 64 65 3d 30 3b 20 28 7a 4d 6f 64  r(eMode=0; (zMod
4ec0: 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
4ed0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4d 6f 64 65  alModename(eMode
4ee0: 29 29 21 3d 30 3b 20 65 4d 6f 64 65 2b 2b 29 7b  ))!=0; eMode++){
4ef0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
4f00: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69  ite3StrNICmp(zRi
4f10: 67 68 74 2c 20 7a 4d 6f 64 65 2c 20 6e 29 3d 3d  ght, zMode, n)==
4f20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4f30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d   }.      if( !zM
4f40: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ode ){.        /
4f50: 2a 20 49 66 20 74 68 65 20 22 3d 4d 4f 44 45 22  * If the "=MODE"
4f60: 20 70 61 72 74 20 64 6f 65 73 20 6e 6f 74 20 6d   part does not m
4f70: 61 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e 20 6a  atch any known j
4f80: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 0a 20 20 20  ournal mode,.   
4f90: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 6f 20       ** then do 
4fa0: 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  a query */.     
4fb0: 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52     eMode = PAGER
4fc0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
4fd0: 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RY;.      }.    
4fe0: 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  }.    if( eMode=
4ff0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
5000: 44 45 5f 51 55 45 52 59 20 26 26 20 70 49 64 32  DE_QUERY && pId2
5010: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->n==0 ){.      
5020: 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52 41 47  /* Convert "PRAG
5030: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22  MA journal_mode"
5040: 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20 6d 61   into "PRAGMA ma
5050: 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22  in.journal_mode"
5060: 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20 3d 20   */.      iDb = 
5070: 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d 3e 6e  0;.      pId2->n
5080: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
5090: 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d 31  for(ii=db->nDb-1
50a0: 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a  ; ii>=0; ii--){.
50b0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
50c0: 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28 69 69  b[ii].pBt && (ii
50d0: 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e  ==iDb || pId2->n
50e0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
50f0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5100: 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20 20 20  tree(v, ii);.   
5110: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5120: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 6f 75  AddOp3(v, OP_Jou
5130: 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20 31 2c  rnalMode, ii, 1,
5140: 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d   eMode);.      }
5150: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5160: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5170: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
5180: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
5190: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
51a0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
51b0: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d  journal_size_lim
51c0: 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  it.  **  PRAGMA 
51d0: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
51e0: 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a 20 20  _size_limit=N.  
51f0: 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73  **.  ** Get or s
5200: 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69  et the size limi
5210: 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  t on rollback jo
5220: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20 20 2a  urnal files..  *
5230: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
5240: 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
5250: 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67 65 72  MIT: {.    Pager
5260: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
5270: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
5280: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36 34 20  ->pBt);.    i64 
5290: 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20 20 20  iLimit = -2;.   
52a0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
52b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f       sqlite3DecO
52c0: 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
52d0: 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  , &iLimit);.    
52e0: 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d 31 20    if( iLimit<-1 
52f0: 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ) iLimit = -1;. 
5300: 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69 74 20     }.    iLimit 
5310: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  = sqlite3PagerJo
5320: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 70  urnalSizeLimit(p
5330: 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29 3b 0a  Pager, iLimit);.
5340: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
5350: 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29 3b 0a  Int(v, iLimit);.
5360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5370: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5380: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
5390: 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  MAS */..  /*.  *
53a0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
53b0: 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d 0a 20  a.]auto_vacuum. 
53c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
53d0: 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ema.]auto_vacuum
53e0: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74  =N.  **.  ** Get
53f0: 20 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c 75   or set the valu
5400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
5410: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
5420: 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2a 20  parameter..  ** 
5430: 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  The value is one
5440: 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31 20 46   of:  0 NONE 1 F
5450: 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e 54 41  ULL 2 INCREMENTA
5460: 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  L.  */.#ifndef S
5470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5480: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5490: 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55 55 4d  gTyp_AUTO_VACUUM
54a0: 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  : {.    Btree *p
54b0: 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20  Bt = pDb->pBt;. 
54c0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d     assert( pBt!=
54d0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  0 );.    if( !zR
54e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
54f0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5500: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
5510: 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 29 29  AutoVacuum(pBt))
5520: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5530: 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d 20 67     int eAuto = g
5540: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a 52 69  etAutoVacuum(zRi
5550: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
5560: 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26 26 20  rt( eAuto>=0 && 
5570: 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20 20 20  eAuto<=2 );.    
5580: 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
5590: 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b 0a 20  c = (u8)eAuto;. 
55a0: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53 65 74       /* Call Set
55b0: 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74 6f 20  AutoVacuum() to 
55c0: 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  set initialize t
55d0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75 74 6f  he internal auto
55e0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e   and.      ** in
55f0: 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67 73 2e  cr-vacuum flags.
5600: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5610: 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 63  d in case this c
5620: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
5630: 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65 20 64  ** creates the d
5640: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
5650: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
5660: 61 74 20 69 74 20 69 73 20 63 72 65 61 74 65 64  at it is created
5670: 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20  .      ** as an 
5680: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
5690: 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20 2a 2f  ble db..      */
56a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
56b0: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
56c0: 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75 74 6f  acuum(pBt, eAuto
56d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
56e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
56f0: 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75 74 6f  Auto==1 || eAuto
5700: 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==2) ){.        
5710: 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e 67 20  /* When setting 
5720: 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  the auto_vacuum 
5730: 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72 20 22  mode to either "
5740: 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20 20 20  full" or .      
5750: 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e 74 61    ** "incrementa
5760: 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20 76 61  l", write the va
5770: 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d 20 69  lue of meta[6] i
5780: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
5790: 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20         ** file. 
57a0: 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  Before writing t
57b0: 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65 63 6b  o meta[6], check
57c0: 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20 69 6e   that meta[3] in
57d0: 64 69 63 61 74 65 73 0a 20 20 20 20 20 20 20 20  dicates.        
57e0: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 65 61  ** that this rea
57f0: 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  lly is an auto-v
5800: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 61  acuum capable da
5810: 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
5820: 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  */.        stati
5830: 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20  c const int iLn 
5840: 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49  = VDBE_OFFSET_LI
5850: 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 20  NENO(2);.       
5860: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
5870: 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65 74 61  beOpList setMeta
5880: 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  6[] = {.        
5890: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
58a0: 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20 20 20  on,    0,       
58b0: 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
58c0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30       0},    /* 0
58d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
58e0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
58f0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c     0,         1,
5900: 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 4c           BTREE_L
5910: 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45  ARGEST_ROOT_PAGE
5920: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f  },.          { O
5930: 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20 20 20  P_If,           
5940: 20 20 31 2c 20 20 20 20 20 20 20 20 20 30 2c 20    1,         0, 
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20  0},    /* 2 */. 
5970: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 48 61           { OP_Ha
5980: 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  lt,           SQ
5990: 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62 6f 72  LITE_OK, OE_Abor
59a0: 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20  t,          0}, 
59b0: 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20     /* 3 */.     
59c0: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
59d0: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 20 20  kie,      0,    
59e0: 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43 52 5f       BTREE_INCR_
59f0: 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20 20 2f  VACUUM, 0},    /
5a00: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  * 4 */.        }
5a10: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  ;.        VdbeOp
5a20: 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *aOp;.        i
5a30: 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
5a40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5a50: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r(v);.        sq
5a60: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
5a70: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
5a80: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74  v, ArraySize(set
5a90: 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20 20 20  Meta6));.       
5aa0: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
5ab0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
5ac0: 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61  rraySize(setMeta
5ad0: 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20 69 4c  6), setMeta6, iL
5ae0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
5af0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
5b00: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
5b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5b20: 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[0].p1 = iDb;
5b30: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  .        aOp[1].
5b40: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5b50: 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20 69 41    aOp[2].p2 = iA
5b60: 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20 20 61  ddr+4;.        a
5b70: 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[4].p1 = iDb;.
5b80: 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70          aOp[4].p
5b90: 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b 0a 20  3 = eAuto - 1;. 
5ba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5bb0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
5bc0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
5bd0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
5be0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
5bf0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5c00: 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74 61 6c  ema.]incremental
5c10: 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a 2a 0a  _vacuum(N).  **.
5c20: 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70 73 20    ** Do N steps 
5c30: 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  of incremental v
5c40: 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20 64 61  acuuming on a da
5c50: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
5c60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5c70: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61  _AUTOVACUUM.  ca
5c80: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43 52 45  se PragTyp_INCRE
5c90: 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a 20 7b  MENTAL_VACUUM: {
5ca0: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c  .    int iLimit,
5cb0: 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28 20 7a   addr;.    if( z
5cc0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73 71 6c  Right==0 || !sql
5cd0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
5ce0: 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20 7c 7c  ght, &iLimit) ||
5cf0: 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20   iLimit<=0 ){.  
5d00: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30 78 37      iLimit = 0x7
5d10: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d 0a 20  fffffff;.    }. 
5d20: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
5d30: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5d40: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
5d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d60: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
5d70: 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b 0a  er, iLimit, 1);.
5d80: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
5d90: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5da0: 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c 20 69  OP_IncrVacuum, i
5db0: 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Db); VdbeCoverag
5dc0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
5dd0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5de0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 29 3b  P_ResultRow, 1);
5df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5e00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
5e10: 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20  Imm, 1, -1);.   
5e20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e30: 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
5e40: 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f  1, addr); VdbeCo
5e50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
5e60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5e70: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
5e80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e90: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
5ea0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5eb0: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
5ec0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
5ed0: 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  ]cache_size.  **
5ee0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5ef0: 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20  .]cache_size=N. 
5f00: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
5f10: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
5f20: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
5f30: 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  l setting for th
5f40: 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  e.  ** page cach
5f50: 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f  e size. The seco
5f60: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65  nd form sets the
5f70: 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65   local.  ** page
5f80: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
5f90: 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f 73 69  e.  If N is posi
5fa0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
5fb0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
5fc0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
5fd0: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
5fe0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
5ff0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6000: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6010: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6020: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6030: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6040: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20  f memory..  */. 
6050: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41   case PragTyp_CA
6060: 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  CHE_SIZE: {.    
6070: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
6080: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
6090: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
60a0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
60b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
60c0: 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 70  gleInt(v, pDb->p
60d0: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
60e0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
60f0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
6100: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
6110: 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ght);.      pDb-
6120: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6130: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  size = size;.   
6140: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
6150: 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d  etCacheSize(pDb-
6160: 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65  >pBt, pDb->pSche
6170: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  ma->cache_size);
6180: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6190: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
61a0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
61b0: 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a 20 20  .]cache_spill.  
61c0: 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65  **  PRAGMA cache
61d0: 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 0a 20  _spill=BOOLEAN. 
61e0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
61f0: 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c  ema.]cache_spill
6200: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
6210: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
6220: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
6230: 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f  local setting fo
6240: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
6250: 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  cache spill size
6260: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
6270: 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20 73 70  m turns cache sp
6280: 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72 20 6f  ill on.  ** or o
6290: 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e 6e 69  ff.  When turnni
62a0: 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f  ng cache spill o
62b0: 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73 20 73  n, the size is s
62c0: 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63  et to the.  ** c
62d0: 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73 69 7a  urrent cache_siz
62e0: 65 2e 20 20 54 68 65 20 74 68 69 72 64 20 66 6f  e.  The third fo
62f0: 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c 6c 20  rm sets a spill 
6300: 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a 20 6d  size that.  ** m
6310: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
6320: 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65 20 73  form the cache s
6330: 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e 20 69  ize..  ** If N i
6340: 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20  s positive then 
6350: 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a  that is the.  **
6360: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6370: 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20   in the cache.  
6380: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
6390: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
63a0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
63b0: 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74  is adjusted so t
63c0: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75 73  hat the cache us
63d0: 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a  es -N kibibytes.
63e0: 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a    ** of memory..
63f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
6400: 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
6410: 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69 73 20  _spill pages is 
6420: 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20 6e 75  less then the nu
6430: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
6440: 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c 20 6e  he_size pages, n
6450: 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63 75 72  o spilling occur
6460: 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  s until the page
6470: 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73 0a 20   count exceeds. 
6480: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
6490: 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61 67  f cache_size pag
64a0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
64b0: 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f  e cache_spill=BO
64c0: 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20 61 70  OLEAN setting ap
64d0: 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61 74 74  plies to all att
64e0: 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c 0a 20  ached schemas,. 
64f0: 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74 68 65   ** not just the
6500: 20 73 63 68 65 6d 61 20 73 70 65 63 69 66 69 65   schema specifie
6510: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  d..  */.  case P
6520: 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 50 49  ragTyp_CACHE_SPI
6530: 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  LL: {.    assert
6540: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6550: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6560: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6570: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6580: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6590: 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28 64 62  (v,.         (db
65a0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
65b0: 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d 30 20  _CacheSpill)==0 
65c0: 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ? 0 : .         
65d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
65e0: 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d  etSpillSize(pDb-
65f0: 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20 7d 65  >pBt,0));.    }e
6600: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  lse{.      int s
6610: 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ize = 1;.      i
6620: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
6630: 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69 7a 65  32(zRight, &size
6640: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
6650: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6660: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  lSize(pDb->pBt, 
6670: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  size);.      }. 
6680: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6690: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
66a0: 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b 0a 20  t, size!=0) ){. 
66b0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
66c0: 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63 68 65   |= SQLITE_Cache
66d0: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c  Spill;.      }el
66e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
66f0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
6700: 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20  _CacheSpill;.   
6710: 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c     }.      setAl
6720: 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b  lPagerFlags(db);
6730: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6750: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
6760: 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20  .]mmap_size(N). 
6770: 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f   **.  ** Used to
6780: 20 73 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a   set mapping siz
6790: 65 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70  e limit. The map
67a0: 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20  ping size limit 
67b0: 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  is.  ** used to 
67c0: 6c 69 6d 69 74 20 74 68 65 20 61 67 67 72 65 67  limit the aggreg
67d0: 61 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  ate size of all 
67e0: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65  memory mapped re
67f0: 67 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a  gions of the.  *
6800: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
6810: 20 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74   If this paramet
6820: 65 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  er is set to zer
6830: 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  o, then memory m
6840: 61 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e  apping.  ** is n
6850: 6f 74 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20  ot used at all. 
6860: 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76   If N is negativ
6870: 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61  e, then the defa
6880: 75 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20  ult memory map. 
6890: 20 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d   ** limit determ
68a0: 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ined by sqlite3_
68b0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
68c0: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20  NFIG_MMAP_SIZE) 
68d0: 69 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65  is set..  ** The
68e0: 20 70 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20   parameter N is 
68f0: 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65  measured in byte
6900: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
6910: 73 20 76 61 6c 75 65 20 69 73 20 61 64 76 69 73  s value is advis
6920: 6f 72 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c  ory.  The underl
6930: 79 69 6e 67 20 56 46 53 20 69 73 20 66 72 65 65  ying VFS is free
6940: 20 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20   to memory map. 
6950: 20 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72   ** as little or
6960: 20 61 73 20 6d 75 63 68 20 61 73 20 69 74 20 77   as much as it w
6970: 61 6e 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69  ants.  Except, i
6980: 66 20 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20  f N is set to 0 
6990: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70  then the.  ** up
69a0: 70 65 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20  per layers will 
69b0: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65  never invoke the
69c0: 20 78 46 65 74 63 68 20 69 6e 74 65 72 66 61 63   xFetch interfac
69d0: 65 73 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20  es to the VFS.. 
69e0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
69f0: 79 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  yp_MMAP_SIZE: {.
6a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
6a10: 34 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45  4 sz;.#if SQLITE
6a20: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
6a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
6a40: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
6a50: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
6a60: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
6a70: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
6a80: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
6a90: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
6aa0: 69 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20  ight, &sz);.    
6ab0: 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20    if( sz<0 ) sz 
6ac0: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
6ad0: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
6ae0: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
6af0: 3d 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  =0 ) db->szMmap 
6b00: 3d 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28  = sz;.      for(
6b10: 69 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69  ii=db->nDb-1; ii
6b20: 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20  >=0; ii--){.    
6b30: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
6b40: 69 69 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d  ii].pBt && (ii==
6b50: 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d  iDb || pId2->n==
6b60: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
6b70: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
6b80: 6d 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62  mapLimit(db->aDb
6b90: 5b 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20  [ii].pBt, sz);. 
6ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20  .    }.    sz = 
6bc0: 2d 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  -1;.    rc = sql
6bd0: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
6be0: 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
6bf0: 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
6c00: 45 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20  E, &sz);.#else. 
6c10: 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72     sz = 0;.    r
6c20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
6c30: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
6c40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6c50: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
6c60: 65 49 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20  eInt(v, sz);.   
6c70: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
6c80: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
6c90: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
6ca0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50  nErr++;.      pP
6cb0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
6cc0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
6cd0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
6ce0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
6cf0: 72 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  re.  **   PRAGMA
6d00: 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64   temp_store = "d
6d10: 65 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22  efault"|"memory"
6d20: 7c 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a  |"file".  **.  *
6d30: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
6d40: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
6d50: 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72  of the temp_stor
6d60: 65 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  e flag.  Changin
6d70: 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  g.  ** the local
6d80: 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
6d90: 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  make changes to 
6da0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e  the disk file an
6db0: 64 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  d the default.  
6dc0: 2a 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ** value will be
6dd0: 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65   restored the ne
6de0: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
6df0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a  base is opened..
6e00: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
6e10: 68 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62  hat it is possib
6e20: 6c 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61  le for the libra
6e30: 72 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ry compile-time 
6e40: 6f 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20  options to.  ** 
6e50: 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 73 65  override this se
6e60: 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73  tting.  */.  cas
6e70: 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53  e PragTyp_TEMP_S
6e80: 54 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  TORE: {.    if( 
6e90: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6ea0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6eb0: 28 76 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  (v, db->temp_sto
6ec0: 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  re);.    }else{.
6ed0: 20 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70        changeTemp
6ee0: 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20  Storage(pParse, 
6ef0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  zRight);.    }. 
6f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f10: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f20: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
6f30: 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52  ectory.  **   PR
6f40: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
6f50: 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22  directory = ""|"
6f60: 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a  directory_name".
6f70: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
6f80: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
6f90: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  l value of the t
6fa0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
6fb0: 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ory flag.  Chang
6fc0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ing.  ** the val
6fd0: 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66  ue sets a specif
6fe0: 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ic directory to 
6ff0: 62 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  be used for temp
7000: 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a  orary files..  *
7010: 2a 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e  * Setting to a n
7020: 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72  ull string rever
7030: 74 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  ts to the defaul
7040: 74 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  t temporary dire
7050: 63 74 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20  ctory search..  
7060: 2a 2a 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20  ** If temporary 
7070: 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61  directory is cha
7080: 6e 67 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c  nged, then inval
7090: 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65  idateTempStorage
70a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
70b0: 73 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f  se PragTyp_TEMP_
70c0: 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a  STORE_DIRECTORY:
70d0: 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67   {.    if( !zRig
70e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ht ){.      retu
70f0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7100: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
7110: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c  ectory);.    }el
7120: 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se{.#ifndef SQLI
7130: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
7140: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7150: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
7160: 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
7170: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
7180: 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68  (db->pVfs, zRigh
7190: 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  t, SQLITE_ACCESS
71a0: 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73  _READWRITE, &res
71b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
71c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
71d0: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
71e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
71f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
7200: 20 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65   a writable dire
7210: 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20  ctory");.       
7220: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
7230: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
7240: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7250: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7260: 45 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  E==0.       || (
7270: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7280: 45 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==1 && db->temp
7290: 5f 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20  _store<=1).     
72a0: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
72b0: 50 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62  P_STORE==2 && db
72c0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29  ->temp_store==1)
72d0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
72e0: 20 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70    invalidateTemp
72f0: 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b  Storage(pParse);
7300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7310: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69  qlite3_free(sqli
7320: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
7330: 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ry);.      if( z
7340: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7350: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70      sqlite3_temp
7360: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c  _directory = sql
7370: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
7380: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
7390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
73a0: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
73b0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  rectory = 0;.   
73c0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
73d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a  QLITE_OMIT_WSD *
73e0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  /.    }.    brea
73f0: 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  k;.  }..#if SQLI
7400: 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20  TE_OS_WIN.  /*. 
7410: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74   **   PRAGMA dat
7420: 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
7430: 79 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  y.  **   PRAGMA 
7440: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
7450: 74 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63  tory = ""|"direc
7460: 74 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a  tory_name".  **.
7470: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
7480: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
7490: 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73  ue of the data_s
74a0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66  tore_directory f
74b0: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
74c0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65   ** the value se
74d0: 74 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69  ts a specific di
74e0: 72 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73  rectory to be us
74f0: 65 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ed for database 
7500: 66 69 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  files that.  ** 
7510: 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 77  were specified w
7520: 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
7530: 61 74 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e  athname.  Settin
7540: 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69  g to a null stri
7550: 6e 67 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20  ng reverts.  ** 
7560: 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  to the default d
7570: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
7580: 79 2c 20 77 68 69 63 68 20 66 6f 72 20 64 61 74  y, which for dat
7590: 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63  abase files spec
75a0: 69 66 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  ified with.  ** 
75b0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
75c0: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65  will probably be
75d0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
75e0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  rrent directory 
75f0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f  for the.  ** pro
7600: 63 65 73 73 2e 20 20 44 61 74 61 62 61 73 65 20  cess.  Database 
7610: 66 69 6c 65 20 73 70 65 63 69 66 69 65 64 20 77  file specified w
7620: 69 74 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20  ith an absolute 
7630: 70 61 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70  path are not imp
7640: 61 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  acted.  ** by th
7650: 69 73 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61  is setting, rega
7660: 72 64 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61  rdless of its va
7670: 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  lue..  **.  */. 
7680: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41   case PragTyp_DA
7690: 54 41 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f  TA_STORE_DIRECTO
76a0: 52 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  RY: {.    if( !z
76b0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
76c0: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
76d0: 76 2c 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  v, sqlite3_data_
76e0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
76f0: 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53  }else{.#ifndef S
7700: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
7710: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7720: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  0] ){.        in
7730: 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
7740: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
7750: 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52  ess(db->pVfs, zR
7760: 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43  ight, SQLITE_ACC
7770: 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26  ESS_READWRITE, &
7780: 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
7790: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
77a0: 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  || res==0 ){.   
77b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
77c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
77d0: 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64  not a writable d
77e0: 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20  irectory");.    
77f0: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
7800: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  a_out;.        }
7810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7820: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69  qlite3_free(sqli
7830: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
7840: 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ry);.      if( z
7850: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7860: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
7870: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c  _directory = sql
7880: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
7890: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
78a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
78b0: 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
78c0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  rectory = 0;.   
78d0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
78e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a  QLITE_OMIT_WSD *
78f0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  /.    }.    brea
7900: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
7910: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
7920: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
7930: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
7940: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f  A [schema.]lock_
7950: 70 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20  proxy_file.  ** 
7960: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7970: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7980: 65 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f  e = ":auto:"|"lo
7990: 63 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20  ck_file_path".  
79a0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
79b0: 72 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  r set the value 
79c0: 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78  of the lock_prox
79d0: 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68  y_file flag.  Ch
79e0: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
79f0: 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65  value sets a spe
7a00: 63 69 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65  cific file to be
7a10: 20 75 73 65 64 20 66 6f 72 20 64 61 74 61 62 61   used for databa
7a20: 73 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e  se access locks.
7a30: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
7a40: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50  e PragTyp_LOCK_P
7a50: 52 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20  ROXY_FILE: {.   
7a60: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7a70: 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
7a80: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
7a90: 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74  eePager(pDb->pBt
7aa0: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
7ab0: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d  roxy_file_path =
7ac0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c   NULL;.      sql
7ad0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
7ae0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
7af0: 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
7b00: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
7b10: 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
7b20: 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  e, SQLITE_GET_LO
7b30: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f           &proxy_
7b60: 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20  file_path);.    
7b70: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
7b80: 78 74 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65  xt(v, proxy_file
7b90: 5f 70 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73  _path);.    }els
7ba0: 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  e{.      Pager *
7bb0: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
7bc0: 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e  BtreePager(pDb->
7bd0: 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pBt);.      sqli
7be0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
7bf0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
7c00: 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
7c10: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7c20: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7c30: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71  {.        res=sq
7c40: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
7c50: 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  ol(pFile, SQLITE
7c60: 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
7c70: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 20 20 20 20 7a 52 69 67 68 74            zRight
7ca0: 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
7cb0: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71  {.        res=sq
7cc0: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
7cd0: 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  ol(pFile, SQLITE
7ce0: 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
7cf0: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b            NULL);
7d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7d30: 66 28 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f  f( res!=SQLITE_O
7d40: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
7d50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7d60: 72 73 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  rse, "failed to 
7d70: 73 65 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  set lock proxy f
7d80: 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67  ile");.        g
7d90: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
7da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7db0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
7dc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
7dd0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
7de0: 4c 45 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20  LE */      .    
7df0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
7e00: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e  GMA [schema.]syn
7e10: 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20  chronous.  **   
7e20: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
7e30: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c  synchronous=OFF|
7e40: 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45  ON|NORMAL|FULL|E
7e50: 58 54 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  XTRA.  **.  ** R
7e60: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7e70: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
7e80: 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  the synchronous 
7e90: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7ea0: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76    ** the local v
7eb0: 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  alue does not ma
7ec0: 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ke changes to th
7ed0: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20  e disk file and 
7ee0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
7ef0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
7f00: 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74  estored the next
7f10: 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
7f20: 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65  se is.  ** opene
7f30: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  d..  */.  case P
7f40: 72 61 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f  ragTyp_SYNCHRONO
7f50: 55 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  US: {.    if( !z
7f60: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
7f70: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
7f80: 2c 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65  , pDb->safety_le
7f90: 76 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  vel-1);.    }els
7fa0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62  e{.      if( !db
7fb0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
7fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7fd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 61  .            "Sa
7ff0: 66 65 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e  fety level may n
8000: 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e  ot be changed in
8010: 73 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69  side a transacti
8020: 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  on");.      }els
8030: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
8040: 4c 65 76 65 6c 20 3d 20 28 67 65 74 53 61 66 65  Level = (getSafe
8050: 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74 2c 30  tyLevel(zRight,0
8060: 2c 31 29 2b 31 29 20 26 20 50 41 47 45 52 5f 53  ,1)+1) & PAGER_S
8070: 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b  YNCHRONOUS_MASK;
8080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 65  .        if( iLe
8090: 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76 65 6c 20  vel==0 ) iLevel 
80a0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 62  = 1;.        pDb
80b0: 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ->safety_level =
80c0: 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20   iLevel;.       
80d0: 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 20 3d   pDb->bSyncSet =
80e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74 41   1;.        setA
80f0: 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29  llPagerFlags(db)
8100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
8120: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8130: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
8140: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
8150: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f  QLITE_OMIT_FLAG_
8160: 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65 20 50  PRAGMAS.  case P
8170: 72 61 67 54 79 70 5f 46 4c 41 47 3a 20 7b 0a 20  ragTyp_FLAG: {. 
8180: 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30     if( zRight==0
8190: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 50 72 61   ){.      setPra
81a0: 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e  gmaResultColumnN
81b0: 61 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29  ames(v, pPragma)
81c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
81d0: 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64 62 2d 3e  ngleInt(v, (db->
81e0: 66 6c 61 67 73 20 26 20 70 50 72 61 67 6d 61 2d  flags & pPragma-
81f0: 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a 20 20 20  >iArg)!=0 );.   
8200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
8210: 74 20 6d 61 73 6b 20 3d 20 70 50 72 61 67 6d 61  t mask = pPragma
8220: 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a 20 4d 61  ->iArg;    /* Ma
8230: 73 6b 20 6f 66 20 62 69 74 73 20 74 6f 20 73 65  sk of bits to se
8240: 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a 2f 0a 20  t or clear. */. 
8250: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
8260: 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
8270: 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 69 67 6e        /* Foreign
8280: 20 6b 65 79 20 73 75 70 70 6f 72 74 20 6d 61 79   key support may
8290: 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c 65 64 20   not be enabled 
82a0: 6f 72 20 64 69 73 61 62 6c 65 64 20 77 68 69 6c  or disabled whil
82b0: 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  e not.        **
82c0: 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20   in auto-commit 
82d0: 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mode.  */.      
82e0: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49    mask &= ~(SQLI
82f0: 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 3b  TE_ForeignKeys);
8300: 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
8310: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
8320: 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  ICATION.      if
8330: 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c  ( db->auth.authL
8340: 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55 73 65 72  evel==UAUTH_User
8350: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
8360: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e 6f 6e 2d  o not allow non-
8370: 61 64 6d 69 6e 20 75 73 65 72 73 20 74 6f 20 6d  admin users to m
8380: 6f 64 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  odify the schema
8390: 20 61 72 62 69 74 72 61 72 69 6c 79 20 2a 2f 0a   arbitrarily */.
83a0: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20          mask &= 
83b0: 7e 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  ~(SQLITE_WriteSc
83c0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a 23  hema);.      }.#
83d0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
83e0: 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
83f0: 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29 7b  an(zRight, 0) ){
8400: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
8410: 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  gs |= mask;.    
8420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8430: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 6d   db->flags &= ~m
8440: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ask;.        if(
8450: 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45 5f 44 65   mask==SQLITE_De
8460: 66 65 72 46 4b 73 20 29 20 64 62 2d 3e 6e 44 65  ferFKs ) db->nDe
8470: 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
8480: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
8490: 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20 74 68 65    /* Many of the
84a0: 20 66 6c 61 67 2d 70 72 61 67 6d 61 73 20 6d 6f   flag-pragmas mo
84b0: 64 69 66 79 20 74 68 65 20 63 6f 64 65 20 67 65  dify the code ge
84c0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 53  nerated by the S
84d0: 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  QL .      ** com
84e0: 70 69 6c 65 72 20 28 65 67 2e 20 63 6f 75 6e 74  piler (eg. count
84f0: 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f 20 61 64  _changes). So ad
8500: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 6f 20 65  d an opcode to e
8510: 78 70 69 72 65 20 61 6c 6c 0a 20 20 20 20 20 20  xpire all.      
8520: 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 20  ** compiled SQL 
8530: 73 74 61 74 65 6d 65 6e 74 73 20 61 66 74 65 72  statements after
8540: 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 70 72 61   modifying a pra
8550: 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  gma value..     
8560: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8570: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
8580: 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 20  P_Expire);.     
8590: 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67   setAllPagerFlag
85a0: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s(db);.    }.   
85b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
85c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
85d0: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 20 2a  T_FLAG_PRAGMAS *
85e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
85f0: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52  E_OMIT_SCHEMA_PR
8600: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
8610: 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69    PRAGMA table_i
8620: 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a 20 20 2a  nfo(<table>).  *
8630: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20  *.  ** Return a 
8640: 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f 72 20 65  single row for e
8650: 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
8660: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 20 54  e named table. T
8670: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
8680: 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ** the returned 
8690: 64 61 74 61 20 73 65 74 20 61 72 65 3a 0a 20 20  data set are:.  
86a0: 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20 20 20 20  **.  ** cid:    
86b0: 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64 20 28 6e      Column id (n
86c0: 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66  umbered from lef
86d0: 74 20 74 6f 20 72 69 67 68 74 2c 20 73 74 61 72  t to right, star
86e0: 74 69 6e 67 20 61 74 20 30 29 0a 20 20 2a 2a 20  ting at 0).  ** 
86f0: 6e 61 6d 65 3a 20 20 20 20 20 20 20 43 6f 6c 75  name:       Colu
8700: 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 79 70  mn name.  ** typ
8710: 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  e:       Column 
8720: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8730: 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20  ..  ** notnull: 
8740: 20 20 20 54 72 75 65 20 69 66 20 27 4e 4f 54 20     True if 'NOT 
8750: 4e 55 4c 4c 27 20 69 73 20 70 61 72 74 20 6f 66  NULL' is part of
8760: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
8770: 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f 76 61  ion.  ** dflt_va
8780: 6c 75 65 3a 20 54 68 65 20 64 65 66 61 75 6c 74  lue: The default
8790: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
87a0: 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a 20  olumn, if any.. 
87b0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
87c0: 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69  yp_TABLE_INFO: i
87d0: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
87e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
87f0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
8800: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
8810: 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52  se, LOCATE_NOERR
8820: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
8830: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
8840: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 0a        int i, k;.
8850: 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64 65        int nHidde
8860: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f 6c  n = 0;.      Col
8870: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  umn *pCol;.     
8880: 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
8890: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
88a0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
88b0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
88c0: 20 36 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   6;.      sqlite
88d0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
88e0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
88f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 69 65        sqlite3Vie
8900: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
8910: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
8920: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 43       for(i=0, pC
8930: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
8940: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
8950: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
8960: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
8970: 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29 7b 0a 20  olumn(pCol) ){. 
8980: 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65 6e           nHidden
8990: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
89a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
89b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
89c0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
89d0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
89e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
89f0: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
8a00: 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d 30  }else if( pPk==0
8a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20   ){.          k 
8a20: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
8a30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
8a40: 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d 3e  r(k=1; k<=pTab->
8a50: 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69 43  nCol && pPk->aiC
8a60: 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20 6b  olumn[k-1]!=i; k
8a70: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d 0a  ++){}.        }.
8a80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8a90: 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20 7c  pCol->pDflt==0 |
8aa0: 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f  | pCol->pDflt->o
8ab0: 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20 20  p==TK_SPAN );.  
8ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ad0: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
8ae0: 20 22 69 73 73 69 73 69 22 2c 0a 20 20 20 20 20   "issisi",.     
8af0: 20 20 20 20 20 20 20 20 20 20 69 2d 6e 48 69 64            i-nHid
8b00: 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  den,.           
8b10: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c      pCol->zName,
8b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b30: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
8b40: 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20  e(pCol,""),.    
8b50: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8b60: 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30  >notNull ? 1 : 0
8b70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8b80: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70   pCol->pDflt ? p
8b90: 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54  Col->pDflt->u.zT
8ba0: 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20  oken : 0,.      
8bb0: 20 20 20 20 20 20 20 20 20 6b 29 3b 0a 20 20 20           k);.   
8bc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8bd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8be0: 75 6c 74 52 6f 77 2c 20 31 2c 20 36 29 3b 0a 20  ultRow, 1, 6);. 
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c00: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
8c10: 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53 3a  e PragTyp_STATS:
8c20: 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49   {.    Index *pI
8c30: 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d  dx;.    HashElem
8c40: 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *i;.    pParse-
8c50: 3e 6e 4d 65 6d 20 3d 20 34 3b 0a 20 20 20 20 73  >nMem = 4;.    s
8c60: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
8c70: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
8c80: 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  Db);.    for(i=s
8c90: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8ca0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
8cb0: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
8cc0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
8cd0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
8ce0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
8cf0: 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71  ata(i);.      sq
8d00: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8d10: 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69 22 2c  ad(v, 1, "ssii",
8d20: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
8d30: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
8d40: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
8d50: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
8d60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
8d70: 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 29 3b 0a  b->nRowLogEst);.
8d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8d90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
8da0: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 34 29 3b 0a  sultRow, 1, 4);.
8db0: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
8dc0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
8dd0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
8de0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ext){.        sq
8df0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8e00: 61 64 28 76 2c 20 32 2c 20 22 73 69 69 22 2c 0a  ad(v, 2, "sii",.
8e10: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
8e20: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8e30: 20 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f     pIdx->szIdxRo
8e40: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  w,.           pI
8e50: 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
8e60: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0]);.        sql
8e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8e80: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8e90: 31 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 4);.      }. 
8ea0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
8eb0: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
8ec0: 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69 66  p_INDEX_INFO: if
8ed0: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
8ee0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
8ef0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8f00: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
8f10: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52  FindIndex(db, zR
8f20: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
8f30: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
8f40: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
8f50: 6e 74 20 6d 78 3b 0a 20 20 20 20 20 20 69 66 28  nt mx;.      if(
8f60: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29   pPragma->iArg )
8f70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41  {.        /* PRA
8f80: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20  GMA index_xinfo 
8f90: 28 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 20 77  (newer version w
8fa0: 69 74 68 20 6d 6f 72 65 20 72 6f 77 73 20 61 6e  ith more rows an
8fb0: 64 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20  d columns) */.  
8fc0: 20 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d        mx = pIdx-
8fd0: 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
8fe0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8ff0: 20 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   6;.      }else{
9000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47  .        /* PRAG
9010: 4d 41 20 69 6e 64 65 78 5f 69 6e 66 6f 20 28 6c  MA index_info (l
9020: 65 67 61 63 79 20 76 65 72 73 69 6f 6e 29 20 2a  egacy version) *
9030: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
9040: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
9050: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9060: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 20 20 7d 0a  em = 3;.      }.
9070: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64        pTab = pId
9080: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  x->pTable;.     
9090: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
90a0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
90b0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 61 73 73   iDb);.      ass
90c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ert( pParse->nMe
90d0: 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61  m<=pPragma->nPra
90e0: 67 43 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  gCName );.      
90f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69  for(i=0; i<mx; i
9100: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  ++){.        i16
9110: 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69   cnum = pIdx->ai
9120: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
9130: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9140: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
9150: 69 73 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a 20 20  is", i, cnum,.  
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 20 20 20 20 20 20 20 20 63 6e 75 6d 3c             cnum<
9180: 30 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 61 43  0 ? 0 : pTab->aC
9190: 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b  ol[cnum].zName);
91a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
91b0: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
91c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
91d0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
91e0: 34 2c 20 22 69 73 69 22 2c 0a 20 20 20 20 20 20  4, "isi",.      
91f0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 6f 72        pIdx->aSor
9200: 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20 20 20 20  tOrder[i],.     
9210: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
9220: 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  oll[i],.        
9230: 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79      i<pIdx->nKey
9240: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Col);.        }.
9250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9260: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9270: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 70 50  ResultRow, 1, pP
9280: 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  arse->nMem);.   
9290: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
92a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20   break;..  case 
92b0: 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 4c 49  PragTyp_INDEX_LI
92c0: 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  ST: if( zRight )
92d0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
92e0: 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
92f0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ab;.    int i;. 
9300: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
9310: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
9320: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
9330: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
9340: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9350: 3d 20 35 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 5;.      sqlit
9360: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9370: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
9380: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9390: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d  pTab->pIndex, i=
93a0: 30 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  0; pIdx; pIdx=pI
93b0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
93c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
93d0: 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20  har *azOrigin[] 
93e0: 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22 70  = { "c", "u", "p
93f0: 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 71  k" };.        sq
9400: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9410: 61 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69 22  ad(v, 1, "isisi"
9420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a  ,.           i,.
9430: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9440: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
9450: 20 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78     IsUniqueIndex
9460: 28 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20  (pIdx),.        
9470: 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78     azOrigin[pIdx
9480: 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20 20  ->idxType],.    
9490: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50 61         pIdx->pPa
94a0: 72 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b 0a  rtIdxWhere!=0);.
94b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
94c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
94d0: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29  ResultRow, 1, 5)
94e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
94f0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
9500: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41 54  case PragTyp_DAT
9510: 41 42 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20 20  ABASE_LIST: {.  
9520: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61    int i;.    pPa
9530: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20  rse->nMem = 3;. 
9540: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
9550: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
9560: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
9570: 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69  ].pBt==0 ) conti
9580: 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
9590: 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  t( db->aDb[i].zD
95a0: 62 53 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  bSName!=0 );.   
95b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
95c0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
95d0: 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 69 2c  ss",.         i,
95e0: 0a 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  .         db->aD
95f0: 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a 20  b[i].zDbSName,. 
9600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
9610: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
9620: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29  db->aDb[i].pBt))
9630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9640: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9650: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29  ResultRow, 1, 3)
9660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
9670: 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61  eak;..  case Pra
9680: 67 54 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c  gTyp_COLLATION_L
9690: 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IST: {.    int i
96a0: 20 3d 20 30 3b 0a 20 20 20 20 48 61 73 68 45 6c   = 0;.    HashEl
96b0: 65 6d 20 2a 70 3b 0a 20 20 20 20 70 50 61 72 73  em *p;.    pPars
96c0: 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20  e->nMem = 2;.   
96d0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
96e0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
96f0: 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69  lSeq); p; p=sqli
9700: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
9710: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9720: 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20  Coll = (CollSeq 
9730: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
9740: 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (p);.      sqlit
9750: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9760: 76 2c 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b 2c  v, 1, "is", i++,
9770: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
9780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9790: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
97a0: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b 0a  sultRow, 1, 2);.
97b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
97c0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
97d0: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
97e0: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
97f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9800: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61  FOREIGN_KEY.  ca
9810: 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49  se PragTyp_FOREI
9820: 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28  GN_KEY_LIST: if(
9830: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 46   zRight ){.    F
9840: 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61  Key *pFK;.    Ta
9850: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
9860: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
9870: 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
9880: 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  t, zDb);.    if(
9890: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
98a0: 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  FK = pTab->pFKey
98b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20  ;.      if( pFK 
98c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
98d0: 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20 20 70   = 0; .        p
98e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b  Parse->nMem = 8;
98f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9900: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
9910: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
9920: 20 20 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b         while(pFK
9930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
9940: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   j;.          fo
9950: 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43  r(j=0; j<pFK->nC
9960: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
9970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9980: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9990: 20 22 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20   "iissssss",.   
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
99c0: 20 20 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20        j,.       
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d              pFK-
99e0: 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  >zTo,.          
99f0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
9a00: 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d  Col[pFK->aCol[j]
9a10: 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20  .iFrom].zName,. 
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a    pFK->aCol[j].z
9a40: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
9a50: 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61          actionNa
9a60: 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b  me(pFK->aAction[
9a70: 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41  1]),  /* ON UPDA
9a80: 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  TE */.          
9a90: 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e           actionN
9aa0: 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e  ame(pFK->aAction
9ab0: 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c  [0]),  /* ON DEL
9ac0: 45 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ETE */.         
9ad0: 20 20 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22            "NONE"
9ae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
9af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9b00: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9b10: 2c 20 31 2c 20 38 29 3b 0a 20 20 20 20 20 20 20  , 1, 8);.       
9b20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
9b30: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
9b40: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
9b50: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
9b60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9b70: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
9b80: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
9b90: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
9ba0: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
9bb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
9bc0: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
9bd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
9be0: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
9bf0: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
9c00: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
9c10: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
9c20: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
9c30: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
9c40: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
9c50: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
9c60: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
9c70: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
9c80: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
9c90: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
9ca0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
9cb0: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
9cc0: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
9cd0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9cf0: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
9d00: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
9d10: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9d20: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9d30: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
9d40: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
9d50: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
9d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9d80: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
9d90: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
9da0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
9db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9dc0: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
9dd0: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
9de0: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
9e10: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
9e20: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
9e30: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
9e40: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
9e50: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
9e60: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
9e70: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
9e80: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
9e90: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
9ea0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
9eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9ec0: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
9ed0: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
9ee0: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
9ef0: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
9f00: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
9f10: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
9f20: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
9f30: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
9f40: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
9f50: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
9f60: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
9f70: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
9f80: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
9f90: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
9fa0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
9fb0: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
9fc0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
9fd0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
9fe0: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
9ff0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
a000: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
a010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
a020: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a030: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
a040: 3b 0a 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65  ;.    k = sqlite
a050: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
a060: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a070: 3e 74 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77  >tblHash);.    w
a080: 68 69 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20  hile( k ){.     
a090: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
a0a0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71         pTab = sq
a0b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a0c0: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67  (pParse, 0, zRig
a0d0: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  ht, zDb);.      
a0e0: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    k = 0;.      }
a0f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
a100: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
a110: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
a120: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
a130: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20  teHashNext(k);. 
a140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a150: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62   pTab==0 || pTab
a160: 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e  ->pFKey==0 ) con
a170: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c  tinue;.      sql
a180: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a190: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
a1a0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
a1b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
a1c0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67  ( pTab->nCol+reg
a1d0: 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  Row>pParse->nMem
a1e0: 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   ) pParse->nMem 
a1f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72  = pTab->nCol + r
a200: 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  egRow;.      sql
a210: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
a220: 61 72 73 65 2c 20 30 2c 20 69 44 62 2c 20 70 54  arse, 0, iDb, pT
a230: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
a240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a250: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
a260: 20 72 65 67 52 65 73 75 6c 74 2c 20 70 54 61 62   regResult, pTab
a270: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a280: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
a290: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
a2a0: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
a2b0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
a2c0: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
a2d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a2e0: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
a2f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a300: 65 6e 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ent==0 ) continu
a310: 65 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  e;.        pIdx 
a320: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
a330: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a340: 61 72 73 65 2c 20 69 44 62 2c 20 70 50 61 72 65  arse, iDb, pPare
a350: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
a360: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
a370: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
a380: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
a390: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
a3a0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
a3b0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
a3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a3d0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
a3e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a3f0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
a400: 2c 20 69 2c 20 69 44 62 2c 20 70 50 61 72 65 6e  , i, iDb, pParen
a410: 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  t, OP_OpenRead);
a420: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a430: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
a440: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a450: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
a460: 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  i, pIdx->tnum, i
a470: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Db);.           
a480: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
a490: 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
a4a0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
a4b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
a4c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  e{.          k =
a4d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
a4e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
a500: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
a510: 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b  r>0 || pFK==0 );
a520: 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20 29  .      if( pFK )
a530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
a540: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69  ( pParse->nTab<i
a550: 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20   ) pParse->nTab 
a560: 3d 20 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = i;.      addrT
a570: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
a580: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
a590: 69 6e 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ind, 0); VdbeCov
a5a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a5b0: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
a5c0: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
a5d0: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
a5e0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
a5f0: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
a600: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a610: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
a620: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
a630: 3b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73  ;.        aiCols
a640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
a650: 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
a660: 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74         x = sqlit
a670: 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28  e3FkLocateIndex(
a680: 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c  pParse, pParent,
a690: 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69   pFK, &pIdx, &ai
a6a0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20  Cols);.         
a6b0: 20 61 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b   assert( x==0 );
a6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6d0: 20 20 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69     addrOk = sqli
a6e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a6f0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (v);.        if(
a700: 20 70 50 61 72 65 6e 74 20 26 26 20 70 49 64 78   pParent && pIdx
a710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a720: 20 69 6e 74 20 69 4b 65 79 20 3d 20 70 46 4b 2d   int iKey = pFK-
a730: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 3b 0a  >aCol[0].iFrom;.
a740: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a750: 28 20 69 4b 65 79 3e 3d 30 20 26 26 20 69 4b 65  ( iKey>=0 && iKe
a760: 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  y<pTab->nCol );.
a770: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4b            if( iK
a780: 65 79 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ey!=pTab->iPKey 
a790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
a7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a7b0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30  (v, OP_Column, 0
a7c0: 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f 77 29 3b  , iKey, regRow);
a7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a7e0: 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
a7f0: 74 28 76 2c 20 70 54 61 62 2c 20 69 4b 65 79 2c  t(v, pTab, iKey,
a800: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20   regRow);.      
a810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a820: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
a830: 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2c 20 61 64  Null, regRow, ad
a840: 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  drOk); VdbeCover
a850: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
a860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a870: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a880: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
a890: 69 64 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b 0a  id, 0, regRow);.
a8a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a8c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
a8d0: 65 6b 52 6f 77 69 64 2c 20 69 2c 20 30 2c 20 72  ekRowid, i, 0, r
a8e0: 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65  egRow); VdbeCove
a8f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
a900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a910: 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  to(v, addrOk);. 
a920: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a930: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a940: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a950: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
a960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a970: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
a980: 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  j<pFK->nCol; j++
a990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
a9a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
a9b0: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
a9c0: 2c 20 70 54 61 62 2c 20 30 2c 0a 20 20 20 20 20  , pTab, 0,.     
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3f 20         aiCols ? 
a9f0: 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d  aiCols[j] : pFK-
aa00: 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 2c 20  >aCol[j].iFrom, 
aa10: 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20  regRow+j);.     
aa20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aa30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
aa40: 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c  sNull, regRow+j,
aa50: 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f   addrOk); VdbeCo
aa60: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
aa70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
aa80: 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
aaa0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
aab0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
aac0: 72 65 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43 6f  regRow, pFK->nCo
aad0: 6c 2c 20 72 65 67 4b 65 79 2c 0a 20 20 20 20 20  l, regKey,.     
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ab00: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
ab10: 28 64 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d 3e  (db,pIdx), pFK->
ab20: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  nCol);.         
ab30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ab40: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
ab50: 75 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20  und, i, addrOk, 
ab60: 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  regKey, 0);.    
ab70: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
ab80: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
ab90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
aba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
abb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
abc0: 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 65 73 75  owid, 0, regResu
abd0: 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  lt+1);.        s
abe0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
abf0: 6f 61 64 28 76 2c 20 72 65 67 52 65 73 75 6c 74  oad(v, regResult
ac00: 2b 32 2c 20 22 73 69 22 2c 20 70 46 4b 2d 3e 7a  +2, "si", pFK->z
ac10: 54 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20  To, i-1);.      
ac20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac30: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
ac40: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
ac50: 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  4);.        sqli
ac60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ac70: 62 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a  bel(v, addrOk);.
ac80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
ac90: 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73  bFree(db, aiCols
aca0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
acb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
acc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30  p2(v, OP_Next, 0
acd0: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
ace0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
acf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ad00: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
ad10: 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Top);.    }.  }.
ad20: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
ad30: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
ad40: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
ad50: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   */.#endif /* !d
ad60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ad70: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
ad80: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  */..#ifndef NDEB
ad90: 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  UG.  case PragTy
ada0: 70 5f 50 41 52 53 45 52 5f 54 52 41 43 45 3a 20  p_PARSER_TRACE: 
adb0: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
adc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
add0: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
ade0: 7a 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20  zRight, 0) ){.  
adf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 72        sqlite3Par
ae00: 73 65 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c  serTrace(stdout,
ae10: 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20   "parser: ");.  
ae20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae30: 20 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72     sqlite3Parser
ae40: 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20  Trace(0, 0);.   
ae50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ae60: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
ae70: 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c 20 74    /* Reinstall t
ae80: 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  he LIKE and GLOB
ae90: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
aea0: 20 76 61 72 69 61 6e 74 20 6f 66 20 4c 49 4b 45   variant of LIKE
aeb0: 0a 20 20 2a 2a 20 75 73 65 64 20 77 69 6c 6c 20  .  ** used will 
aec0: 62 65 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  be case sensitiv
aed0: 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69  e or not dependi
aee0: 6e 67 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 20  ng on the RHS.. 
aef0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
af00: 79 70 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56  yp_CASE_SENSITIV
af10: 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20 69 66  E_LIKE: {.    if
af20: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
af30: 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
af40: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64  rLikeFunctions(d
af50: 62 2c 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  b, sqlite3GetBoo
af60: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 29  lean(zRight, 0))
af70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
af80: 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  eak;..#ifndef SQ
af90: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
afa0: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 0a 23  HECK_ERROR_MAX.#
afb0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49   define SQLITE_I
afc0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
afd0: 52 52 4f 52 5f 4d 41 58 20 31 30 30 0a 23 65 6e  RROR_MAX 100.#en
afe0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
aff0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
b000: 54 59 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 50 72  TY_CHECK.  /* Pr
b010: 61 67 6d 61 20 22 71 75 69 63 6b 5f 63 68 65 63  agma "quick_chec
b020: 6b 22 20 69 73 20 72 65 64 75 63 65 64 20 76 65  k" is reduced ve
b030: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69  rsion of .  ** i
b040: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64  ntegrity_check d
b050: 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63  esigned to detec
b060: 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20  t most database 
b070: 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20  corruption.  ** 
b080: 77 69 74 68 6f 75 74 20 6d 6f 73 74 20 6f 66 20  without most of 
b090: 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
b0a0: 61 20 66 75 6c 6c 20 69 6e 74 65 67 72 69 74 79  a full integrity
b0b0: 2d 63 68 65 63 6b 2e 0a 20 20 2a 2f 0a 20 20 63  -check..  */.  c
b0c0: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54 45  ase PragTyp_INTE
b0d0: 47 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20  GRITY_CHECK: {. 
b0e0: 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64     int i, j, add
b0f0: 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69  r, mxErr;..    i
b100: 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71  nt isQuick = (sq
b110: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65  lite3Tolower(zLe
b120: 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20  ft[0])=='q');.. 
b130: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41     /* If the PRA
b140: 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  GMA command was 
b150: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41  of the form "PRA
b160: 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69  GMA <db>.integri
b170: 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a  ty_check",.    *
b180: 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20 73 65  * then iDb is se
b190: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
b1a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
b1b0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62  dentified by <db
b1c0: 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  >..    ** In thi
b1d0: 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65  s case, the inte
b1e0: 67 72 69 74 79 20 6f 66 20 64 61 74 61 62 61 73  grity of databas
b1f0: 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65  e iDb only is ve
b200: 72 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  rified by.    **
b210: 20 74 68 65 20 56 44 42 45 20 63 72 65 61 74 65   the VDBE create
b220: 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  d below..    **.
b230: 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
b240: 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , if the command
b250: 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41   was simply "PRA
b260: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
b270: 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20  eck" (or.    ** 
b280: 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68  "PRAGMA quick_ch
b290: 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20  eck"), then iDb 
b2a0: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20  is set to 0. In 
b2b0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 69  this case, set i
b2c0: 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20  Db.    ** to -1 
b2d0: 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74  here, to indicat
b2e0: 65 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  e that the VDBE 
b2f0: 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68  should verify th
b300: 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20  e integrity.    
b310: 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68  ** of all attach
b320: 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a  ed databases.  *
b330: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  /.    assert( iD
b340: 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  b>=0 );.    asse
b350: 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49  rt( iDb==0 || pI
b360: 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28  d2->z );.    if(
b370: 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44   pId2->z==0 ) iD
b380: 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20  b = -1;..    /* 
b390: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56  Initialize the V
b3a0: 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  DBE program */. 
b3b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
b3c0: 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 6;..    /* Set
b3d0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72 72   the maximum err
b3e0: 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  or count */.    
b3f0: 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49  mxErr = SQLITE_I
b400: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
b410: 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66  RROR_MAX;.    if
b420: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
b430: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
b440: 32 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72 72  2(zRight, &mxErr
b450: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 45  );.      if( mxE
b460: 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr<=0 ){.       
b470: 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f   mxErr = SQLITE_
b480: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
b490: 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20  ERROR_MAX;.     
b4a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
b4b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b4c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78  , OP_Integer, mx
b4d0: 45 72 72 2c 20 31 29 3b 20 20 2f 2a 20 72 65 67  Err, 1);  /* reg
b4e0: 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73  [1] holds errors
b4f0: 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a   left */..    /*
b500: 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79   Do an integrity
b510: 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64   check on each d
b520: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
b530: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
b540: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
b550: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b      HashElem *x;
b560: 0a 20 20 20 20 20 20 48 61 73 68 20 2a 70 54 62  .      Hash *pTb
b570: 6c 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  ls;.      int *a
b580: 52 6f 6f 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Root;.      int 
b590: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  cnt = 0;.      i
b5a0: 6e 74 20 6d 78 49 64 78 20 3d 20 30 3b 0a 20 20  nt mxIdx = 0;.  
b5b0: 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a 0a 20      int nIdx;.. 
b5c0: 20 20 20 20 20 69 66 28 20 4f 4d 49 54 5f 54 45       if( OMIT_TE
b5d0: 4d 50 44 42 20 26 26 20 69 3d 3d 31 20 29 20 63  MPDB && i==1 ) c
b5e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
b5f0: 66 28 20 69 44 62 3e 3d 30 20 26 26 20 69 21 3d  f( iDb>=0 && i!=
b600: 69 44 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  iDb ) continue;.
b610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
b620: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
b630: 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 20  Parse, i);.     
b640: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
b650: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b660: 49 66 50 6f 73 2c 20 31 29 3b 20 2f 2a 20 48 61  IfPos, 1); /* Ha
b670: 6c 74 20 69 66 20 6f 75 74 20 6f 66 20 65 72 72  lt if out of err
b680: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 56 64 62  ors */.      Vdb
b690: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b6a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
b6c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b6d0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b6e0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20  re(v, addr);..  
b6f0: 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74      /* Do an int
b700: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 66 20  egrity check of 
b710: 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20 20 20  the B-Tree.     
b720: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 67   **.      ** Beg
b730: 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20 74 68  in by finding th
b740: 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d  e root pages num
b750: 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f  bers.      ** fo
b760: 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  r all tables and
b770: 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20   indices in the 
b780: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
b790: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
b7a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
b7b0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30  texHeld(db, i, 0
b7c0: 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73  ) );.      pTbls
b7d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   = &db->aDb[i].p
b7e0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
b7f0: 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30  .      for(cnt=0
b800: 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69  , x=sqliteHashFi
b810: 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78  rst(pTbls); x; x
b820: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
b830: 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  x)){.        Tab
b840: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
b850: 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20  eHashData(x);.  
b860: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
b870: 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  x;.        if( H
b880: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
b890: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  cnt++;.        f
b8a0: 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d  or(nIdx=0, pIdx=
b8b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
b8c0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
b8d0: 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63  Next, nIdx++){ c
b8e0: 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  nt++; }.        
b8f0: 69 66 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29  if( nIdx>mxIdx )
b900: 20 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20   mxIdx = nIdx;. 
b910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f       }.      aRo
b920: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
b930: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
b940: 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31  zeof(int)*(cnt+1
b950: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52  ));.      if( aR
b960: 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oot==0 ) break;.
b970: 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c        for(cnt=0,
b980: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72   x=sqliteHashFir
b990: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
b9a0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
b9b0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
b9c0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
b9d0: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
b9e0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
b9f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  ;.        if( Ha
ba00: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 61  sRowid(pTab) ) a
ba10: 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 54  Root[cnt++] = pT
ba20: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ab->tnum;.      
ba30: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
ba40: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
ba50: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ba60: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f  {.          aRoo
ba70: 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49 64 78 2d  t[cnt++] = pIdx-
ba80: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d  >tnum;.        }
ba90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
baa0: 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30 3b 0a 0a  Root[cnt] = 0;..
bab0: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
bac0: 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75  re sufficient nu
bad0: 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
bae0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  s have been allo
baf0: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  cated */.      p
bb00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
bb10: 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c  X( pParse->nMem,
bb20: 20 38 2b 6d 78 49 64 78 20 29 3b 0a 0a 20 20 20   8+mxIdx );..   
bb30: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 62 2d 74     /* Do the b-t
bb40: 72 65 65 20 69 6e 74 65 67 72 69 74 79 20 63 68  ree integrity ch
bb50: 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  ecks */.      sq
bb60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
bb70: 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  v, OP_IntegrityC
bb80: 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c 20 28 63  k, 2, cnt, 1, (c
bb90: 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34 5f 49 4e  har*)aRoot,P4_IN
bba0: 54 41 52 52 41 59 29 3b 0a 20 20 20 20 20 20 73  TARRAY);.      s
bbb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
bbc0: 50 35 28 76 2c 20 28 75 38 29 69 29 3b 0a 20 20  P5(v, (u8)i);.  
bbd0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
bbe0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
bbf0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 20 56  OP_IsNull, 2); V
bc00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bc20: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
bc30: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a  ring8, 0, 3, 0,.
bc40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bc50: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a  MPrintf(db, "***
bc60: 20 69 6e 20 64 61 74 61 62 61 73 65 20 25 73 20   in database %s 
bc70: 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b  ***\n", db->aDb[
bc80: 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c 0a 20 20  i].zDbSName),.  
bc90: 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
bca0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
bcb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bcc0: 50 5f 4d 6f 76 65 2c 20 32 2c 20 34 2c 20 31 29  P_Move, 2, 4, 1)
bcd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bce0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bcf0: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 32 29  Concat, 4, 3, 2)
bd00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bd10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bd20: 52 65 73 75 6c 74 52 6f 77 2c 20 32 2c 20 31 29  ResultRow, 2, 1)
bd30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bd40: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
bd50: 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ddr);..      /* 
bd60: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  Make sure all th
bd70: 65 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f  e indices are co
bd80: 6e 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63  nstructed correc
bd90: 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
bda0: 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65      for(x=sqlite
bdb0: 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29  HashFirst(pTbls)
bdc0: 3b 20 78 20 26 26 20 21 69 73 51 75 69 63 6b 3b  ; x && !isQuick;
bdd0: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
bde0: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
bdf0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
be00: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
be10: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
be20: 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20  Idx, *pPk;.     
be30: 20 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72     Index *pPrior
be40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
be50: 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20  t loopTop;.     
be60: 20 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c     int iDataCur,
be70: 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
be80: 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a    int r1 = -1;..
be90: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
bea0: 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f  ->pIndex==0 ) co
beb0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
bec0: 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70  pPk = HasRowid(p
bed0: 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74  Tab) ? 0 : sqlit
bee0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
bef0: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
bf00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
bf10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
bf20: 49 66 50 6f 73 2c 20 31 29 3b 20 20 2f 2a 20 53  IfPos, 1);  /* S
bf30: 74 6f 70 20 69 66 20 6f 75 74 20 6f 66 20 65 72  top if out of er
bf40: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rors */.        
bf50: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bf60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bf70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bf80: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
bf90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bfa0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
bfb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
bfc0: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
bfd0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
bfe0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
bff0: 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50  bleAndIndices(pP
c000: 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f  arse, pTab, OP_O
c010: 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20 20 20  penRead, 0,.    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c040: 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72 2c 20  , 0, &iDataCur, 
c050: 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  &iIdxCur);.     
c060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c070: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c080: 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20  er, 0, 7);.     
c090: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78     for(j=0, pIdx
c0a0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
c0b0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
c0c0: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
c0d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c0e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c0f0: 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b  nteger, 0, 8+j);
c100: 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65   /* index entrie
c110: 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  s counter */.   
c120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
c130: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
c140: 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20 20  Mem>=8+j );.    
c150: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c160: 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67  te3NoTempsInRang
c170: 65 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29 20  e(pParse,1,7+j) 
c180: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c1a0: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61 74 61  OP_Rewind, iData
c1b0: 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Cur, 0); VdbeCov
c1c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
c1d0: 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c 69    loopTop = sqli
c1e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c1f0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20 31   OP_AddImm, 7, 1
c200: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65  );.        /* Ve
c210: 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 4e 4f  rify that all NO
c220: 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 72  T NULL columns r
c230: 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e 55  eally are NOT NU
c240: 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  LL */.        fo
c250: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
c260: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
c270: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
c280: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
c290: 6d 70 32 2c 20 6a 6d 70 33 3b 0a 20 20 20 20 20  mp2, jmp3;.     
c2a0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
c2b0: 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
c2c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
c2d0: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
c2e0: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e  notNull==0 ) con
c2f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
c300: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c310: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
c320: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
c330: 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20  ur, j, 3);.     
c340: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c350: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
c360: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
c370: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
c380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c390: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
c3a0: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
c3b0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
c3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3d0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
c3e0: 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63 72 65  1, -1); /* Decre
c3f0: 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d 69 74  ment error limit
c400: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
c410: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
c420: 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61  ntf(db, "NULL va
c430: 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70  lue in %s.%s", p
c440: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
c470: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
c480: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c490: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c4a0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
c4b0: 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e   0, zErr, P4_DYN
c4c0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
c4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4e0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
c4f0: 6f 77 2c 20 33 2c 20 31 29 3b 0a 20 20 20 20 20  ow, 3, 1);.     
c500: 20 20 20 20 20 6a 6d 70 33 20 3d 20 73 71 6c 69       jmp3 = sqli
c510: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c520: 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20 56   OP_IfPos, 1); V
c530: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c540: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c550: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
c560: 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 20 20 20  P_Halt);.       
c570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c580: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b  mpHere(v, jmp2);
c590: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c5a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c5b0: 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20  , jmp3);.       
c5c0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61   }.        /* Va
c5d0: 6c 69 64 61 74 65 20 69 6e 64 65 78 20 65 6e 74  lidate index ent
c5e0: 72 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  ries for the cur
c5f0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  rent row */.    
c600: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64      for(j=0, pId
c610: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
c620: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
c630: 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20  >pNext, j++){.  
c640: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32          int jmp2
c650: 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d  , jmp3, jmp4, jm
c660: 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  p5;.          in
c670: 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74  t ckUniq = sqlit
c680: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c690: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  v);.          if
c6a0: 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f  ( pPk==pIdx ) co
c6b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c6c0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
c6d0: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
c6e0: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61  Parse, pIdx, iDa
c6f0: 74 61 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d  taCur, 0, 0, &jm
c700: 70 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p3,.            
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
c730: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  r, r1);.        
c740: 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64 78 3b    pPrior = pIdx;
c750: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c760: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c770: 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20  OP_AddImm, 8+j, 
c780: 31 29 3b 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e  1);  /* incremen
c790: 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f  t entry count */
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65  .          /* Ve
c7b0: 72 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64  rify that an ind
c7c0: 65 78 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ex entry exists 
c7d0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
c7e0: 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20  table row */.   
c7f0: 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71         jmp2 = sq
c800: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
c810: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
c820: 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69  iIdxCur+j, ckUni
c830: 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  q, r1,.         
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
c860: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62  x->nColumn); Vdb
c870: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c890: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c8a0: 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 20  AddImm, 1, -1); 
c8b0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65 72 72  /* Decrement err
c8c0: 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20  or limit */.    
c8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c8e0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33  eLoadString(v, 3
c8f0: 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20 20  , "row ");.     
c900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c910: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
c920: 63 61 74 2c 20 37 2c 20 33 2c 20 33 29 3b 0a 20  cat, 7, 3, 3);. 
c930: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c940: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
c950: 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20 66  , 4, " missing f
c960: 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20 20  rom index ");.  
c970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c980: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c990: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29  Concat, 4, 3, 3)
c9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 35  ;.          jmp5
c9b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f   = sqlite3VdbeLo
c9c0: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70  adString(v, 4, p
c9d0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
c9e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c9f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ca00: 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b  oncat, 4, 3, 3);
ca10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ca20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ca30: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 33 2c  OP_ResultRow, 3,
ca40: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   1);.          j
ca50: 6d 70 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp4 = sqlite3Vdb
ca60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
ca70: 50 6f 73 2c 20 31 29 3b 20 56 64 62 65 43 6f 76  Pos, 1); VdbeCov
ca80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ca90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
caa0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp0(v, OP_Halt
cab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cac0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
cad0: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
cae0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51       /* For UNIQ
caf0: 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69  UE indexes, veri
cb00: 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65  fy that only one
cb10: 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 77 69   entry exists wi
cb20: 74 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  th the.         
cb30: 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e   ** current key.
cb40: 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20 75    The entry is u
cb50: 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e 79  nique if (1) any
cb60: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a   column is NULL.
cb70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
cb80: 28 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74  (2) the next ent
cb90: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65  ry has a differe
cba0: 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  nt key */.      
cbb0: 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65      if( IsUnique
cbc0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20  Index(pIdx) ){. 
cbd0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75             int u
cbe0: 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  niqOk = sqlite3V
cbf0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
cc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
cc10: 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20 20 20   jmp6;.         
cc20: 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20     int kk;.     
cc30: 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30 3b         for(kk=0;
cc40: 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   kk<pIdx->nKeyCo
cc50: 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  l; kk++){.      
cc60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
cc70: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
cc80: 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  n[kk];.         
cc90: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
cca0: 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69  l!=XN_ROWID && i
ccb0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
ccc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ccd0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
cce0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ccf0: 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e  notNull ) contin
cd00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
cd10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd20: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
cd30: 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29  , r1+kk, uniqOk)
cd40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
cd50: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
cd70: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 36 20             jmp6 
cd80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cd90: 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op1(v, OP_Next, 
cda0: 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64 62 65  iIdxCur+j); Vdbe
cdb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
cdc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cdd0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69 71  VdbeGoto(v, uniq
cde0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Ok);.           
cdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ce00: 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20  Here(v, jmp6);. 
ce10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ce20: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
ce30: 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64  v, OP_IdxGT, iId
ce40: 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20  xCur+j, uniqOk, 
ce50: 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43       pIdx->nKeyC
ce80: 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
ce90: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
cea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ceb0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
cec0: 2c 20 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63  , 1, -1); /* Dec
ced0: 72 65 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d  rement error lim
cee0: 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  it */.          
cef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
cf00: 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e  dString(v, 3, "n
cf10: 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72 79 20  on-unique entry 
cf20: 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20  in index ");.   
cf30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cf40: 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35  VdbeGoto(v, jmp5
cf50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
cf60: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cf70: 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b  eLabel(v, uniqOk
cf80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
cf90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cfa0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cfb0: 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp4);.         
cfc0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
cfd0: 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
cfe0: 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20  se, jmp3);.     
cff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
d000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d010: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74 61  , OP_Next, iData
d020: 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56  Cur, loopTop); V
d030: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d050: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c  dbeJumpHere(v, l
d060: 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64  oopTop-1);.#ifnd
d070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
d080: 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
d090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d0a0: 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22 77  dString(v, 2, "w
d0b0: 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69 65  rong # of entrie
d0c0: 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  s in index ");. 
d0d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
d0e0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
d0f0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
d100: 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b  dx->pNext, j++){
d110: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d120: 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69  Pk==pIdx ) conti
d130: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61  nue;.          a
d140: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d150: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d160: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d170: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d180: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
d190: 72 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+2); VdbeCovera
d1a0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
d1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d1c0: 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  p2(v, OP_Halt, 0
d1d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d1e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d1f0: 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
d200: 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20 20  IdxCur+j, 3);.  
d210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d220: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d230: 45 71 2c 20 38 2b 6a 2c 20 61 64 64 72 2b 38 2c  Eq, 8+j, addr+8,
d240: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
d250: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d260: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d270: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f  eP5(v, SQLITE_NO
d280: 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  TNULL);.        
d290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d2a0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
d2b0: 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  , 1, -1);.      
d2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
d2d0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
d2e0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
d2f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d300: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d310: 43 6f 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37 29  Concat, 3, 2, 7)
d320: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d330: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d340: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 37   OP_ResultRow, 7
d350: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
d360: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d370: 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
d380: 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20 20   */.      } .   
d390: 20 7d 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73   }.    {.      s
d3a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
d3b0: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
d3c0: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
d3d0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d3e0: 56 64 62 65 4f 70 4c 69 73 74 20 65 6e 64 43 6f  VdbeOpList endCo
d3f0: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
d400: 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20   { OP_AddImm,   
d410: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
d420: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
d430: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
d440: 20 20 20 20 20 20 20 20 20 31 2c 20 34 2c 20 20           1, 4,  
d450: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
d460: 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  1 */.        { O
d470: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30  P_String8,     0
d480: 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 3,        0}, 
d490: 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20     /* 2 */.     
d4a0: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
d4b0: 77 2c 20 20 20 33 2c 20 31 2c 20 20 20 20 20 20  w,   3, 1,      
d4c0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f    0},    /* 3 */
d4d0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
d4e0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20  VdbeOp *aOp;..  
d4f0: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
d500: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
d510: 2c 20 41 72 72 61 79 53 69 7a 65 28 65 6e 64 43  , ArraySize(endC
d520: 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69  ode), endCode, i
d530: 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Ln);.      if( a
d540: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f  Op ){.        aO
d550: 70 5b 30 5d 2e 70 32 20 3d 20 2d 6d 78 45 72 72  p[0].p2 = -mxErr
d560: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d  ;.        aOp[2]
d570: 2e 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41  .p4type = P4_STA
d580: 54 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  TIC;.        aOp
d590: 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b  [2].p4.z = "ok";
d5a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d5b0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
d5c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d5d0: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
d5e0: 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
d5f0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
d600: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
d610: 4d 41 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a  MA encoding.  **
d620: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
d630: 6e 67 20 3d 20 22 75 74 66 2d 38 22 7c 22 75 74  ng = "utf-8"|"ut
d640: 66 2d 31 36 22 7c 22 75 74 66 2d 31 36 6c 65 22  f-16"|"utf-16le"
d650: 7c 22 75 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a  |"utf-16be".  **
d660: 0a 20 20 2a 2a 20 49 6e 20 69 74 73 20 66 69 72  .  ** In its fir
d670: 73 74 20 66 6f 72 6d 2c 20 74 68 69 73 20 70 72  st form, this pr
d680: 61 67 6d 61 20 72 65 74 75 72 6e 73 20 74 68 65  agma returns the
d690: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65   encoding of the
d6a0: 20 6d 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62   main.  ** datab
d6b0: 61 73 65 2e 20 49 66 20 74 68 65 20 64 61 74 61  ase. If the data
d6c0: 62 61 73 65 20 69 73 20 6e 6f 74 20 69 6e 69 74  base is not init
d6d0: 69 61 6c 69 7a 65 64 2c 20 69 74 20 69 73 20 69  ialized, it is i
d6e0: 6e 69 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a  nitialized now..
d6f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
d700: 63 6f 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68 69  cond form of thi
d710: 73 20 70 72 61 67 6d 61 20 69 73 20 61 20 6e 6f  s pragma is a no
d720: 2d 6f 70 20 69 66 20 74 68 65 20 6d 61 69 6e 20  -op if the main 
d730: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
d740: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
d750: 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  dy been initiali
d760: 7a 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  zed. In this cas
d770: 65 20 69 74 20 73 65 74 73 20 74 68 65 20 64 65  e it sets the de
d780: 66 61 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64  fault.  ** encod
d790: 69 6e 67 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ing that will be
d7a0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61   used for the ma
d7b0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
d7c0: 20 69 66 20 61 20 6e 65 77 20 66 69 6c 65 0a 20   if a new file. 
d7d0: 20 2a 2a 20 69 73 20 63 72 65 61 74 65 64 2e 20   ** is created. 
d7e0: 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d  If an existing m
d7f0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
d800: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65  e is opened, the
d810: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  n the.  ** defau
d820: 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  lt text encoding
d830: 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 69 6e   for the existin
d840: 67 20 64 61 74 61 62 61 73 65 20 69 73 20 75 73  g database is us
d850: 65 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  ed..  ** .  ** I
d860: 6e 20 61 6c 6c 20 63 61 73 65 73 20 6e 65 77 20  n all cases new 
d870: 64 61 74 61 62 61 73 65 73 20 63 72 65 61 74 65  databases create
d880: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
d890: 43 48 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20  CH command are. 
d8a0: 20 2a 2a 20 63 72 65 61 74 65 64 20 74 6f 20 75   ** created to u
d8b0: 73 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61  se the same defa
d8c0: 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ult text encodin
d8d0: 67 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61  g as the main da
d8e0: 74 61 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20  tabase. If.  ** 
d8f0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
d900: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 69  e has not been i
d910: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f  nitialized and/o
d920: 72 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 41  r created when A
d930: 54 54 41 43 48 0a 20 20 2a 2a 20 69 73 20 65 78  TTACH.  ** is ex
d940: 65 63 75 74 65 64 2c 20 74 68 69 73 20 69 73 20  ecuted, this is 
d950: 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
d960: 41 54 54 41 43 48 20 6f 70 65 72 61 74 69 6f 6e  ATTACH operation
d970: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74  ..  **.  ** In t
d980: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74  he second form t
d990: 68 69 73 20 70 72 61 67 6d 61 20 73 65 74 73 20  his pragma sets 
d9a0: 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
d9b0: 67 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 0a  g to be used in.
d9c0: 20 20 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73    ** new databas
d9d0: 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
d9e0: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
d9f0: 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 74 20 69  ase handle. It i
da00: 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66  s only.  ** usef
da10: 75 6c 20 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d  ul if invoked im
da20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
da30: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
da40: 65 20 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  e i.  */.  case 
da50: 50 72 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47  PragTyp_ENCODING
da60: 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
da70: 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e  onst struct EncN
da80: 61 6d 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ame {.      char
da90: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75   *zName;.      u
daa0: 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63  8 enc;.    } enc
dab0: 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  names[] = {.    
dac0: 20 20 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20    { "UTF8",     
dad0: 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20  SQLITE_UTF8     
dae0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
daf0: 54 46 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45  TF-8",    SQLITE
db00: 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20  _UTF8        }, 
db10: 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d   /* Must be elem
db20: 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20  ent [1] */.     
db30: 20 7b 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53   { "UTF-16le", S
db40: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20  QLITE_UTF16LE   
db50: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
db60: 20 65 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a   element [2] */.
db70: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62        { "UTF-16b
db80: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
db90: 42 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75  BE     },  /* Mu
dba0: 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33  st be element [3
dbb0: 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  ] */.      { "UT
dbc0: 46 31 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f  F16le",  SQLITE_
dbd0: 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20  UTF16LE     },. 
dbe0: 20 20 20 20 20 7b 20 22 55 54 46 31 36 62 65 22       { "UTF16be"
dbf0: 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ,  SQLITE_UTF16B
dc00: 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  E     },.      {
dc10: 20 22 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20   "UTF-16",   0  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46  }, /* SQLITE_UTF
dc40: 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20  16NATIVE */.    
dc50: 20 20 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20    { "UTF16",    
dc60: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
dc70: 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f     }, /* SQLITE_
dc80: 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20  UTF16NATIVE */. 
dc90: 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
dca0: 20 20 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73    };.    const s
dcb0: 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70  truct EncName *p
dcc0: 45 6e 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Enc;.    if( !zR
dcd0: 69 67 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50  ight ){    /* "P
dce0: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20  RAGMA encoding" 
dcf0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
dd00: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
dd10: 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72  Parse) ) goto pr
dd20: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
dd30: 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73  assert( encnames
dd40: 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e  [SQLITE_UTF8].en
dd50: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c==SQLITE_UTF8 )
dd60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dd70: 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f  encnames[SQLITE_
dd80: 55 54 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51  UTF16LE].enc==SQ
dd90: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a  LITE_UTF16LE );.
dda0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
ddb0: 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54  cnames[SQLITE_UT
ddc0: 46 31 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49  F16BE].enc==SQLI
ddd0: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
dde0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
ddf0: 54 65 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73  Text(v, encnames
de00: 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29  [ENC(pParse->db)
de10: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ].zName);.    }e
de20: 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
de30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
de40: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
de50: 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20 20 20 20  = XXX" */.      
de60: 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74  /* Only change t
de70: 68 65 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  he value of sqli
de80: 74 65 2e 65 6e 63 20 69 66 20 74 68 65 20 64 61  te.enc if the da
de90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69 73  tabase handle is
dea0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e   not.      ** in
deb0: 69 74 69 61 6c 69 7a 65 64 2e 20 49 66 20 74 68  itialized. If th
dec0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
ded0: 65 78 69 73 74 73 2c 20 74 68 65 20 6e 65 77 20  exists, the new 
dee0: 73 71 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75 65  sqlite.enc value
def0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
df00: 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
df10: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  en the schema is
df20: 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e 20 49 66   next loaded. If
df30: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20   it does not.   
df40: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78     ** already ex
df50: 69 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 65  ists, it will be
df60: 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20   created to use 
df70: 74 68 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67  the new encoding
df80: 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f   value..      */
df90: 0a 20 20 20 20 20 20 69 66 28 20 0a 20 20 20 20  .      if( .    
dfa0: 20 20 20 20 21 28 44 62 48 61 73 50 72 6f 70 65      !(DbHasPrope
dfb0: 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53 63  rty(db, 0, DB_Sc
dfc0: 68 65 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20  hemaLoaded)) || 
dfd0: 0a 20 20 20 20 20 20 20 20 44 62 48 61 73 50 72  .        DbHasPr
dfe0: 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42  operty(db, 0, DB
dff0: 5f 45 6d 70 74 79 29 20 0a 20 20 20 20 20 20 29  _Empty) .      )
e000: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 45  {.        for(pE
e010: 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b  nc=&encnames[0];
e020: 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45   pEnc->zName; pE
e030: 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  nc++){.         
e040: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
e050: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 70  trICmp(zRight, p
e060: 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20  Enc->zName) ){. 
e070: 20 20 20 20 20 20 20 20 20 20 20 53 43 48 45 4d             SCHEM
e080: 41 5f 45 4e 43 28 64 62 29 20 3d 20 45 4e 43 28  A_ENC(db) = ENC(
e090: 64 62 29 20 3d 0a 20 20 20 20 20 20 20 20 20 20  db) =.          
e0a0: 20 20 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20        pEnc->enc 
e0b0: 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51  ? pEnc->enc : SQ
e0c0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
e0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
e0e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
e0f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e100: 20 20 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e     if( !pEnc->zN
e110: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
e120: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e130: 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70  (pParse, "unsupp
e140: 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20  orted encoding: 
e150: 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  %s", zRight);.  
e160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
e180: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
e190: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
e1a0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e1b0: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45  E_OMIT_SCHEMA_VE
e1c0: 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  RSION_PRAGMAS.  
e1d0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
e1e0: 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61   [schema.]schema
e1f0: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20  _version.  **   
e200: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
e210: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d  schema_version =
e220: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
e230: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e240: 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73  chema.]user_vers
e250: 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ion.  **   PRAGM
e260: 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f  A [schema.]user_
e270: 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67  version = <integ
e280: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er>.  **.  **   
e290: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
e2a0: 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20  freelist_count. 
e2b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e2c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f  A [schema.]data_
e2d0: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a  version.  **.  *
e2e0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
e2f0: 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f  ma.]application_
e300: 69 64 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  id.  **   PRAGMA
e310: 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63   [schema.]applic
e320: 61 74 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65  ation_id = <inte
e330: 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger>.  **.  ** T
e340: 68 65 20 70 72 61 67 6d 61 27 73 20 73 63 68 65  he pragma's sche
e350: 6d 61 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20 75  ma_version and u
e360: 73 65 72 5f 76 65 72 73 69 6f 6e 20 61 72 65 20  ser_version are 
e370: 75 73 65 64 20 74 6f 20 73 65 74 20 6f 72 20 67  used to set or g
e380: 65 74 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  et.  ** the valu
e390: 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2d  e of the schema-
e3a0: 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72  version and user
e3b0: 2d 76 65 72 73 69 6f 6e 2c 20 72 65 73 70 65 63  -version, respec
e3c0: 74 69 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a  tively. Both.  *
e3d0: 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  * the schema-ver
e3e0: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 75 73 65  sion and the use
e3f0: 72 2d 76 65 72 73 69 6f 6e 20 61 72 65 20 33 32  r-version are 32
e400: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
e410: 67 65 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64  gers.  ** stored
e420: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
e430: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20   header..  **.  
e440: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 2d 63 6f  ** The schema-co
e450: 6f 6b 69 65 20 69 73 20 75 73 75 61 6c 6c 79 20  okie is usually 
e460: 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 64  only manipulated
e470: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53   internally by S
e480: 51 4c 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69  QLite. It.  ** i
e490: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  s incremented by
e4a0: 20 53 51 4c 69 74 65 20 77 68 65 6e 65 76 65 72   SQLite whenever
e4b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
e4c0: 68 65 6d 61 20 69 73 20 6d 6f 64 69 66 69 65 64  hema is modified
e4d0: 20 28 62 79 0a 20 20 2a 2a 20 63 72 65 61 74 69   (by.  ** creati
e4e0: 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e 67 20 61  ng or dropping a
e4f0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 29   table or index)
e500: 2e 20 54 68 65 20 73 63 68 65 6d 61 20 76 65 72  . The schema ver
e510: 73 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 0a  sion is used by.
e520: 20 20 2a 2a 20 53 51 4c 69 74 65 20 65 61 63 68    ** SQLite each
e530: 20 74 69 6d 65 20 61 20 71 75 65 72 79 20 69 73   time a query is
e540: 20 65 78 65 63 75 74 65 64 20 74 6f 20 65 6e 73   executed to ens
e550: 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e 74  ure that the int
e560: 65 72 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a  ernal cache.  **
e570: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 75   of the schema u
e580: 73 65 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69  sed when compili
e590: 6e 67 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  ng the SQL query
e5a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 63 68   matches the sch
e5b0: 65 6d 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ema of.  ** the 
e5c0: 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 73 74  database against
e5d0: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 69   which the compi
e5e0: 6c 65 64 20 71 75 65 72 79 20 69 73 20 61 63 74  led query is act
e5f0: 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 0a  ually executed..
e600: 20 20 2a 2a 20 53 75 62 76 65 72 74 69 6e 67 20    ** Subverting 
e610: 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 62  this mechanism b
e620: 79 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  y using "PRAGMA 
e630: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20  schema_version" 
e640: 74 6f 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  to modify.  ** t
e650: 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f  he schema-versio
e660: 6e 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  n is potentially
e670: 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d   dangerous and m
e680: 61 79 20 6c 65 61 64 20 74 6f 20 70 72 6f 67 72  ay lead to progr
e690: 61 6d 0a 20 20 2a 2a 20 63 72 61 73 68 65 73 20  am.  ** crashes 
e6a0: 6f 72 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  or database corr
e6b0: 75 70 74 69 6f 6e 2e 20 55 73 65 20 77 69 74 68  uption. Use with
e6c0: 20 63 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20   caution!.  **. 
e6d0: 20 2a 2a 20 54 68 65 20 75 73 65 72 2d 76 65 72   ** The user-ver
e6e0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65 64  sion is not used
e6f0: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53   internally by S
e700: 51 4c 69 74 65 2e 20 49 74 20 6d 61 79 20 62 65  QLite. It may be
e710: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 61 70   used by.  ** ap
e720: 70 6c 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 61  plications for a
e730: 6e 79 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f  ny purpose..  */
e740: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
e750: 48 45 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a  HEADER_VALUE: {.
e760: 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20      int iCookie 
e770: 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b  = pPragma->iArg;
e780: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69    /* Which cooki
e790: 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
e7a0: 74 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  te */.    sqlite
e7b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
e7c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
e7d0: 7a 52 69 67 68 74 20 26 26 20 28 70 50 72 61 67  zRight && (pPrag
e7e0: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
e7f0: 72 61 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29  ragFlg_ReadOnly)
e800: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
e810: 57 72 69 74 65 20 74 68 65 20 73 70 65 63 69 66  Write the specif
e820: 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ied cookie value
e830: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
e840: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
e850: 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20  t setCookie[] = 
e860: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54  {.        { OP_T
e870: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30  ransaction,    0
e880: 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  1,  0},    /*
e890: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   0 */.        { 
e8a0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
e8b0: 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20     0,  0,  0},  
e8c0: 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20    /* 1 */.      
e8d0: 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  };.      VdbeOp 
e8e0: 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  *aOp;.      sqli
e8f0: 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d  te3VdbeVerifyNoM
e900: 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c  allocRequired(v,
e910: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f   ArraySize(setCo
e920: 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f  okie));.      aO
e930: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
e940: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
e950: 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29  ySize(setCookie)
e960: 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b  , setCookie, 0);
e970: 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f  .      if( ONLY_
e980: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
e990: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
e9a0: 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  k;.      aOp[0].
e9b0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
e9c0: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
e9d0: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32  .      aOp[1].p2
e9e0: 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20   = iCookie;.    
e9f0: 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71    aOp[1].p3 = sq
ea00: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
ea10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ea20: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
ea30: 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65  specified cookie
ea40: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20   value */.      
ea50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
ea60: 65 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b  eOpList readCook
ea70: 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ie[] = {.       
ea80: 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f   { OP_Transactio
ea90: 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  n,     0,  0,  0
eaa0: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
eab0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
eac0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
ead0: 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20  1,  0},    /* 1 
eae0: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
eaf0: 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20  ResultRow,      
eb00: 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20   1,  1,  0}.    
eb10: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
eb20: 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71  p *aOp;.      sq
eb30: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
eb40: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
eb50: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61  v, ArraySize(rea
eb60: 64 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20  dCookie));.     
eb70: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
eb80: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
eb90: 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f  rraySize(readCoo
eba0: 6b 69 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c  kie),readCookie,
ebb0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e  0);.      if( ON
ebc0: 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54  LY_IF_REALLOC_ST
ebd0: 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62  RESS(aOp==0) ) b
ebe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b  reak;.      aOp[
ebf0: 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  0].p1 = iDb;.   
ec00: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
ec10: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
ec20: 2e 70 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20  .p3 = iCookie;. 
ec30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ec40: 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 20  Reusable(v);.   
ec50: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
ec60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ec70: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52  _OMIT_SCHEMA_VER
ec80: 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  SION_PRAGMAS */.
ec90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eca0: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
ecb0: 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20  ON_DIAGS.  /*.  
ecc0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70  **   PRAGMA comp
ecd0: 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a  ile_options.  **
ece0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
ecf0: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f   names of all co
ed00: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
ed10: 6e 73 20 75 73 65 64 20 69 6e 20 74 68 69 73 20  ns used in this 
ed20: 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20  build,.  ** one 
ed30: 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a  option per row..
ed40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
ed50: 54 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49  Typ_COMPILE_OPTI
ed60: 4f 4e 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ONS: {.    int i
ed70: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
ed80: 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
ed90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31  pParse->nMem = 1
eda0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f  ;.    while( (zO
edb0: 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  pt = sqlite3_com
edc0: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69  pileoption_get(i
edd0: 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ++))!=0 ){.     
ede0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
edf0: 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70  String(v, 1, zOp
ee00: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ee10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee20: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
ee30: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
ee40: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
ee50: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  e(v);.  }.  brea
ee60: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
ee70: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
ee80: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a  OPTION_DIAGS */.
ee90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eea0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20  OMIT_WAL.  /*.  
eeb0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
eec0: 65 6d 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f  ema.]wal_checkpo
eed0: 69 6e 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75  int = passive|fu
eee0: 6c 6c 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63  ll|restart|trunc
eef0: 61 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  ate.  **.  ** Ch
ef00: 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74  eckpoint the dat
ef10: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
ef20: 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43  se PragTyp_WAL_C
ef30: 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
ef40: 20 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32   int iBt = (pId2
ef50: 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d  ->z?iDb:SQLITE_M
ef60: 41 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20  AX_ATTACHED);.  
ef70: 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51    int eMode = SQ
ef80: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
ef90: 50 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28  PASSIVE;.    if(
efa0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
efb0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
efc0: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c  Cmp(zRight, "ful
efd0: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
efe0: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
eff0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
f000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f010: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f020: 28 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61 72  (zRight, "restar
f030: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
f040: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
f050: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
f060: 41 52 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ART;.      }else
f070: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f080: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 74 72 75  Cmp(zRight, "tru
f090: 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ncate")==0 ){.  
f0a0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51        eMode = SQ
f0b0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
f0c0: 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20  TRUNCATE;.      
f0d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
f0e0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20  se->nMem = 3;.  
f0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f100: 4f 70 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  Op3(v, OP_Checkp
f110: 6f 69 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65  oint, iBt, eMode
f120: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
f130: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f140: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
f150: 33 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  3);.  }.  break;
f160: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
f170: 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65  AGMA wal_autoche
f180: 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50  ckpoint.  **   P
f190: 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68  RAGMA wal_autoch
f1a0: 65 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a  eckpoint = N.  *
f1b0: 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65  *.  ** Configure
f1c0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
f1d0: 65 63 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61  ection to automa
f1e0: 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
f1f0: 6e 74 20 61 20 64 61 74 61 62 61 73 65 0a 20 20  nt a database.  
f200: 2a 2a 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c  ** after accumul
f210: 61 74 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69  ating N frames i
f220: 6e 20 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75  n the log. Or qu
f230: 65 72 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  ery for the curr
f240: 65 6e 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  ent value.  ** o
f250: 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  f N..  */.  case
f260: 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54   PragTyp_WAL_AUT
f270: 4f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20  OCHECKPOINT: {. 
f280: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
f290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77  .      sqlite3_w
f2a0: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
f2b0: 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f  t(db, sqlite3Ato
f2c0: 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  i(zRight));.    
f2d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
f2e0: 6c 65 49 6e 74 28 76 2c 20 0a 20 20 20 20 20 20  leInt(v, .      
f2f0: 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
f300: 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c 44 65 66  k==sqlite3WalDef
f310: 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20  aultHook ? .    
f320: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 54         SQLITE_PT
f330: 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61  R_TO_INT(db->pWa
f340: 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a  lArg) : 0);.  }.
f350: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
f360: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
f370: 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79  MA shrink_memory
f380: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
f390: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
f3a0: 32 33 34 34 35 2d 34 36 31 30 39 20 54 68 69 73  23445-46109 This
f3b0: 20 70 72 61 67 6d 61 20 63 61 75 73 65 73 20 74   pragma causes t
f3c0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
f3d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77   connection on w
f3e0: 68 69 63 68 20 69 74 20 69 73 20 69 6e 76 6f 6b  hich it is invok
f3f0: 65 64 20 74 6f 20 66 72 65 65 20 75 70 20 61 73  ed to free up as
f400: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
f410: 69 74 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20  it.  ** can, by 
f420: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
f430: 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
f440: 79 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  y()..  */.  case
f450: 20 50 72 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f   PragTyp_SHRINK_
f460: 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71  MEMORY: {.    sq
f470: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
f480: 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20  _memory(db);.   
f490: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f4a0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f4b0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a  busy_timeout.  *
f4c0: 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
f4d0: 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a  timeout = N.  **
f4e0: 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  ** Call sqlit
f4f0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
f500: 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20  db, N).  Return 
f510: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
f520: 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  out value.  ** i
f530: 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49  f one is set.  I
f540: 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65  f no busy handle
f550: 72 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74  r or a different
f560: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73   busy handler is
f570: 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30   set.  ** then 0
f580: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53   is returned.  S
f590: 65 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f  etting the busy_
f5a0: 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20  timeout to 0 or 
f5b0: 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69  negative.  ** di
f5c0: 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f  sables the timeo
f5d0: 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73  ut..  */.  /*cas
f5e0: 65 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  e PragTyp_BUSY_T
f5f0: 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74  IMEOUT*/ default
f600: 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  : {.    assert( 
f610: 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79  pPragma->ePragTy
f620: 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f  p==PragTyp_BUSY_
f630: 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69  TIMEOUT );.    i
f640: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
f650: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
f660: 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69  timeout(db, sqli
f670: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
f680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
f690: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64  rnSingleInt(v, d
f6a0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b  b->busyTimeout);
f6b0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f6c0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
f6d0: 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
f6e0: 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  mit.  **   PRAGM
f6f0: 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  A soft_heap_limi
f700: 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
f710: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
f720: 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30  F: R-26343-45930
f730: 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76   This pragma inv
f740: 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71  okes the.  ** sq
f750: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
f760: 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66  limit64() interf
f770: 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67  ace with the arg
f780: 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73  ument N, if N is
f790: 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
f7a0: 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  and is a non-neg
f7b0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20  ative integer.. 
f7c0: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
f7d0: 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30  ON-OF: R-64451-0
f7e0: 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65  7163 The soft_he
f7f0: 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20  ap_limit pragma 
f800: 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75  always.  ** retu
f810: 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74  rns the same int
f820: 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20  eger that would 
f830: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f840: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
f850: 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
f860: 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65  4(-1) C-language
f870: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
f880: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
f890: 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20  OFT_HEAP_LIMIT: 
f8a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
f8b0: 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a  t64 N;.    if( z
f8c0: 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33  Right && sqlite3
f8d0: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
f8e0: 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
f8f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
f900: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
f910: 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20  limit64(N);.    
f920: 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
f930: 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
f940: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
f950: 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  64(-1));.    bre
f960: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
f970: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65  **   PRAGMA thre
f980: 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ads.  **   PRAGM
f990: 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20  A threads = N.  
f9a0: 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72  **.  ** Configur
f9b0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
f9c0: 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74  mber of worker t
f9d0: 68 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20  hreads.  Return 
f9e0: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78  the new.  ** max
f9f0: 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68  imum, which migh
fa00: 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72  t be less than r
fa10: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
fa20: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48   case PragTyp_TH
fa30: 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c  READS: {.    sql
fa40: 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20  ite3_int64 N;.  
fa50: 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20    if( zRight.   
fa60: 20 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f    && sqlite3DecO
fa70: 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
fa80: 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
fa90: 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20  .     && N>=0.  
faa0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
fab0: 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
fac0: 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
fad0: 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28  _THREADS, (int)(
fae0: 4e 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a  N&0x7fffffff));.
faf0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
fb00: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c  SingleInt(v, sql
fb10: 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
fb20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
fb30: 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29  ER_THREADS, -1))
fb40: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
fb50: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
fb60: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
fb70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
fb80: 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65  ST).  /*.  ** Re
fb90: 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
fba0: 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c   state of file l
fbb0: 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ogs for all data
fbc0: 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73  bases.  */.  cas
fbd0: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53  e PragTyp_LOCK_S
fbe0: 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61  TATUS: {.    sta
fbf0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
fc00: 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65  const azLockName
fc10: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e  [] = {.      "un
fc20: 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64  locked", "shared
fc30: 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22  ", "reserved", "
fc40: 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75  pending", "exclu
fc50: 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20  sive".    };.   
fc60: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72   int i;.    pPar
fc70: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
fc80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
fc90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
fca0: 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
fcb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fcc0: 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77  zState = "unknow
fcd0: 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  n";.      int j;
fce0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
fcf0: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d  Db[i].zDbSName==
fd00: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
fd10: 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44      pBt = db->aD
fd20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
fd30: 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71  if( pBt==0 || sq
fd40: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
fd50: 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pBt)==0 ){.     
fd60: 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f     zState = "clo
fd70: 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  sed";.      }els
fd80: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69  e if( sqlite3_fi
fd90: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69  le_control(db, i
fda0: 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44   ? db->aDb[i].zD
fdb0: 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20  bSName : 0, .   
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c    SQLITE_FCNTL_L
fdf0: 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53  OCKSTATE, &j)==S
fe00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fe10: 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a       zState = az
fe20: 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20  LockName[j];.   
fe30: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
fe40: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
fe50: 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e  v, 1, "ss", db->
fe60: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c  aDb[i].zDbSName,
fe70: 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   zState);.      
fe80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe90: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
fea0: 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  w, 1, 2);.    }.
feb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
fec0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
fed0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
fee0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b 45   case PragTyp_KE
fef0: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  Y: {.    if( zRi
ff00: 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b 65  ght ) sqlite3_ke
ff10: 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52  y_v2(db, zDb, zR
ff20: 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72  ight, sqlite3Str
ff30: 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a  len30(zRight));.
ff40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
ff50: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 52 45   case PragTyp_RE
ff60: 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  KEY: {.    if( z
ff70: 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f  Right ) sqlite3_
ff80: 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  rekey_v2(db, zDb
ff90: 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65  , zRight, sqlite
ffa0: 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74  3Strlen30(zRight
ffb0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
ffc0: 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79   }.  case PragTy
ffd0: 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20  p_HEXKEY: {.    
ffe0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
fff0: 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
10000 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
10010 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a   char zKey[40];.
10020 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69        for(i=0, i
10030 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  Byte=0; i<sizeof
10040 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69  (zKey)*2 && sqli
10050 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69 67  te3Isxdigit(zRig
10060 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ht[i]); i++){.  
10070 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69        iByte = (i
10080 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74  Byte<<4) + sqlit
10090 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68  e3HexToInt(zRigh
100a0 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t[i]);.        i
100b0 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
100c0 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
100d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
100e0 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20 30  f( (zLeft[3] & 0
100f0 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20 20  xf)==0xb ){.    
10100 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
10110 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79  v2(db, zDb, zKey
10120 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 65  , i/2);.      }e
10130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10140 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62  ite3_rekey_v2(db
10150 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32  , zDb, zKey, i/2
10160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10170 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10180 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
10190 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
101a0 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  DEC) || defined(
101b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45  SQLITE_ENABLE_CE
101c0 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61 67  ROD).  case Prag
101d0 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58 54  Typ_ACTIVATE_EXT
101e0 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52 69  ENSIONS: if( zRi
101f0 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ght ){.#ifdef SQ
10200 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
10210 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
10220 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  rNICmp(zRight, "
10230 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a  see-", 4)==0 ){.
10240 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63        sqlite3_ac
10250 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69 67  tivate_see(&zRig
10260 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ht[4]);.    }.#e
10270 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
10280 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0a  TE_ENABLE_CEROD.
10290 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
102a0 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
102b0 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30 20  "cerod-", 6)==0 
102c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
102d0 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64 28  _activate_cerod(
102e0 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20 20  &zRight[6]);.   
102f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
10300 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
10310 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65   } /* End of the
10320 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20 2a   PRAGMA switch *
10330 2f 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20  /..pragma_out:. 
10340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10350 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c  b, zLeft);.  sql
10360 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10370 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65  Right);.}.#ifnde
10380 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10390 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a  RTUALTABLE./****
103a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70  *********.** Imp
103f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
10400 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  n eponymous virt
10410 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72  ual table that r
10420 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a  uns a pragma..**
10430 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
10440 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 50 72  ct PragmaVtab Pr
10450 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65  agmaVtab;.typede
10460 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  f struct PragmaV
10470 74 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61  tabCursor Pragma
10480 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75  VtabCursor;.stru
10490 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a  ct PragmaVtab {.
104a0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62    sqlite3_vtab b
104b0 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ase;        /* B
104c0 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
104d0 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
104e0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
104f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10500 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10510 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20  ion to which it 
10520 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e  belongs */.  con
10530 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
10540 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
10550 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  f the pragma */.
10560 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20    u8 nHidden;   
10570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10580 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20  umber of hidden 
10590 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
105a0 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20  iHidden;        
105b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
105c0 6f 66 20 74 68 65 20 66 69 72 73 74 20 68 69 64  of the first hid
105d0 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b  den column */.};
105e0 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74  .struct PragmaVt
105f0 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  abCursor {.  sql
10600 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
10610 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63   base; /* Base c
10620 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66  lass.  Must be f
10630 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
10640 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b  3_stmt *pPragma;
10650 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d      /* The pragm
10660 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  a statement to r
10670 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69  un */.  sqlite_i
10680 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20  nt64 iRowid;    
10690 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
106a0 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a  id */.  char *az
106b0 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  Arg[2];         
106c0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
106d0 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  e argument and s
106e0 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  chema */.};../* 
106f0 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
10700 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
10710 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e  xConnect method.
10720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10730 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
10740 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10750 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
10760 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
10770 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
10780 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
10790 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
107a0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
107b0 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
107c0 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e   *pPragma = (con
107d0 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70  st PragmaName*)p
107e0 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  Aux;.  PragmaVta
107f0 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69  b *pTab = 0;.  i
10800 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
10810 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d  j;.  char cSep =
10820 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d   '(';.  StrAccum
10830 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75   acc;.  char zBu
10840 66 5b 32 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  f[200];..  sqlit
10850 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
10860 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69  acc, 0, zBuf, si
10870 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a  zeof(zBuf), 0);.
10880 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
10890 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c  mAppendAll(&acc,
108a0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   "CREATE TABLE x
108b0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ");.  for(i=0, j
108c0 3d 70 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43  =pPragma->iPragC
108d0 4e 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d  Name; i<pPragma-
108e0 3e 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b  >nPragCName; i++
108f0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  , j++){.    sqli
10900 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c  te3XPrintf(&acc,
10910 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53 65   "%c\"%s\"", cSe
10920 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29  p, pragCName[j])
10930 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27  ;.    cSep = ','
10940 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20  ;.  }.  j = 0;. 
10950 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50   if( pPragma->mP
10960 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
10970 5f 52 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20  _Result1 ){.    
10980 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
10990 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22  ppendAll(&acc, "
109a0 2c 61 72 67 20 48 49 44 44 45 4e 22 29 3b 0a 20  ,arg HIDDEN");. 
109b0 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66     j++;.  }.  if
109c0 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67  ( pPragma->mPrag
109d0 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 53  Flg & (PragFlg_S
109e0 63 68 65 6d 61 4f 70 74 7c 50 72 61 67 46 6c 67  chemaOpt|PragFlg
109f0 5f 53 63 68 65 6d 61 52 65 71 29 20 29 7b 0a 20  _SchemaReq) ){. 
10a00 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
10a10 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63  umAppendAll(&acc
10a20 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45  , ",schema HIDDE
10a30 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  N");.    j++;.  
10a40 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
10a50 63 75 6d 41 70 70 65 6e 64 28 26 61 63 63 2c 20  cumAppend(&acc, 
10a60 22 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ")", 1);.  sqlit
10a70 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
10a80 28 26 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74  (&acc);.  assert
10a90 28 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c  ( strlen(zBuf) <
10aa0 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20   sizeof(zBuf)-1 
10ab0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
10ac0 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
10ad0 62 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  b, zBuf);.  if( 
10ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10af0 0a 20 20 20 20 70 54 61 62 20 3d 20 28 50 72 61  .    pTab = (Pra
10b00 67 6d 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33  gmaVtab*)sqlite3
10b10 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50  _malloc(sizeof(P
10b20 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
10b30 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
10b40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10b50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
10b60 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
10b70 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66  (pTab, 0, sizeof
10b80 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20  (PragmaVtab));. 
10b90 20 20 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65       pTab->pName
10ba0 20 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20   = pPragma;.    
10bb0 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b    pTab->db = db;
10bc0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69  .      pTab->iHi
10bd0 64 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20  dden = i;.      
10be0 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20  pTab->nHidden = 
10bf0 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  j;.    }.  }else
10c00 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
10c10 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10c20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
10c30 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20  msg(db));.  }.. 
10c40 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69   *ppVtab = (sqli
10c50 74 65 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a  te3_vtab*)pTab;.
10c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10c70 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
10c80 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
10c90 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d  le xDisconnect m
10ca0 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
10cb0 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44   int pragmaVtabD
10cc0 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65  isconnect(sqlite
10cd0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
10ce0 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
10cf0 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
10d00 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74  *)pVtab;.  sqlit
10d10 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20  e3_free(pTab);. 
10d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10d30 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20  K;.}../* Figure 
10d40 6f 75 74 20 74 68 65 20 62 65 73 74 20 69 6e 64  out the best ind
10d50 65 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61  ex to use to sea
10d60 72 63 68 20 61 20 70 72 61 67 6d 61 20 76 69 72  rch a pragma vir
10d70 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
10d80 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20  * There are not 
10d90 72 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78  really any index
10da0 20 63 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77   choices.  But w
10db0 65 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72  e want to encour
10dc0 61 67 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79  age the.** query
10dd0 20 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65   planner to give
10de0 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
10df0 6f 6e 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65  on as many hidde
10e00 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a  n parameters as.
10e10 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64  ** possible, and
10e20 20 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74   especially on t
10e30 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20  he first hidden 
10e40 70 61 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72  parameter.  So r
10e50 65 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20  eturn a.** high 
10e60 63 6f 73 74 20 69 66 20 68 69 64 64 65 6e 20 70  cost if hidden p
10e70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e  arameters are un
10e80 63 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a  constrained..*/.
10e90 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
10ea0 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 28 73  aVtabBestIndex(s
10eb0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
10ec0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
10ed0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b  info *pIdxInfo){
10ee0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
10ef0 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Tab = (PragmaVta
10f00 62 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  b*)tab;.  const 
10f10 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
10f20 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
10f30 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  *pConstraint;.  
10f40 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
10f50 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78  seen[2];..  pIdx
10f60 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
10f70 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  ost = (double)1;
10f80 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69  .  if( pTab->nHi
10f90 64 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72  dden==0 ){ retur
10fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  n SQLITE_OK; }. 
10fb0 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   pConstraint = p
10fc0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
10fd0 61 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20  aint;.  seen[0] 
10fe0 3d 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d  = 0;.  seen[1] =
10ff0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
11000 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
11010 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f  traint; i++, pCo
11020 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20  nstraint++){.   
11030 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
11040 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f  ->usable==0 ) co
11050 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
11060 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21  pConstraint->op!
11070 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
11080 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f  NSTRAINT_EQ ) co
11090 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
110a0 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
110b0 6c 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69  lumn < pTab->iHi
110c0 64 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  dden ) continue;
110d0 0a 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72  .    j = pConstr
110e0 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20  aint->iColumn - 
110f0 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20  pTab->iHidden;. 
11100 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32     assert( j < 2
11110 20 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6e   );.    if( seen
11120 5b 6a 5d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  [j] ) continue;.
11130 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b      seen[j] = i+
11140 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65 65  1;.  }.  if( see
11150 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  n[0]==0 ){.    p
11160 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
11170 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
11180 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20  )2147483647;.   
11190 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
111a0 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37 34  atedRows = 21474
111b0 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75 72  83647;.    retur
111c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
111d0 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d 31  .  j = seen[0]-1
111e0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
111f0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
11200 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b  ].argvIndex = 1;
11210 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
11220 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
11230 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  .omit = 1;.  if(
11240 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72 65   seen[1]==0 ) re
11250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11260 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
11270 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
11280 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49 6e  ble)20;.  pIdxIn
11290 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
112a0 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73 65  s = 20;.  j = se
112b0 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78 49  en[1]-1;.  pIdxI
112c0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
112d0 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64  Usage[j].argvInd
112e0 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e  ex = 2;.  pIdxIn
112f0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
11300 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31  sage[j].omit = 1
11310 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61  E_OK;.}../* Crea
11330 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
11340 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20 76  for the pragma v
11350 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
11360 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
11370 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74 65  aVtabOpen(sqlite
11380 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73  3_vtab *pVtab, s
11390 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
113a0 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a  or **ppCursor){.
113b0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
113c0 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72  or *pCsr;.  pCsr
113d0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
113e0 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  rsor*)sqlite3_ma
113f0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43 73  lloc(sizeof(*pCs
11400 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72 3d  r));.  if( pCsr=
11410 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11420 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
11430 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
11440 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  of(PragmaVtabCur
11450 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62  sor));.  pCsr->b
11460 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74 61  ase.pVtab = pVta
11470 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  b;.  *ppCursor =
11480 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20   &pCsr->base;.  
11490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
114a0 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61 6c  ;.}../* Clear al
114b0 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  l content from p
114c0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
114d0 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 73  ble cursor. */.s
114e0 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67 6d  tatic void pragm
114f0 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
11500 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
11510 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20  r *pCsr){.  int 
11520 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  i;.  sqlite3_fin
11530 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61  alize(pCsr->pPra
11540 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70 50  gma);.  pCsr->pP
11550 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f 72  ragma = 0;.  for
11560 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
11570 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b 20  e(pCsr->azArg); 
11580 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11590 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a 41  3_free(pCsr->azA
115a0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73 72  rg[i]);.    pCsr
115b0 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b 0a  ->azArg[i] = 0;.
115c0 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20    }.}../* Close 
115d0 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
115e0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f   table cursor */
115f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
11600 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c 69  maVtabClose(sqli
11610 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
11620 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  *cur){.  PragmaV
11630 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
11640 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
11650 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61 67  sor*)cur;.  prag
11660 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
11670 72 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  r(pCsr);.  retur
11680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11690 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70  /* Advance the p
116a0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
116b0 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  ble cursor to th
116c0 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74  e next row */.st
116d0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
116e0 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  tabNext(sqlite3_
116f0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
11700 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  abCursor){.  Pra
11710 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
11720 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
11730 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
11740 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rsor;.  int rc =
11750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
11760 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
11770 78 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a  xRowid value */.
11780 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b    pCsr->iRowid++
11790 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 50  ;.  if( pCsr->pP
117a0 72 61 67 6d 61 20 29 7b 0a 20 20 20 20 69 66 28  ragma ){.    if(
117b0 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c   SQLITE_ROW!=sql
117c0 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e  ite3_step(pCsr->
117d0 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20 20  pPragma) ){.    
117e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
117f0 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
11800 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 70 43  ragma);.      pC
11810 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b  sr->pPragma = 0;
11820 0a 20 20 20 20 20 20 70 72 61 67 6d 61 56 74 61  .      pragmaVta
11830 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73  bCursorClear(pCs
11840 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
11850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11860 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
11870 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
11880 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
11890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
118a0 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28  ragmaVtabFilter(
118b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
118c0 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
118d0 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e  sor, .  int idxN
118e0 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
118f0 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
11900 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
11910 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72  e **argv.){.  Pr
11920 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
11930 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
11940 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
11950 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56  ursor;.  PragmaV
11960 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
11970 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43  gmaVtab*)(pVtabC
11980 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
11990 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
119a0 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63  ;.  StrAccum acc
119b0 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
119c0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72  .  pragmaVtabCur
119d0 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
119e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
119f0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  c; i++){.    ass
11a00 65 72 74 28 20 69 3c 41 72 72 61 79 53 69 7a 65  ert( i<ArraySize
11a10 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b  (pCsr->azArg) );
11a20 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67  .    pCsr->azArg
11a30 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [i] = sqlite3_mp
11a40 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
11a50 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
11a60 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20 69 66  rgv[i]));.    if
11a70 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d  ( pCsr->azArg[i]
11a80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
11a90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11ab0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
11ac0 74 28 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c  t(&acc, 0, 0, 0,
11ad0 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69   pTab->db->aLimi
11ae0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
11af0 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73  QL_LENGTH]);.  s
11b00 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
11b10 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 50  pendAll(&acc, "P
11b20 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28 20  RAGMA ");.  if( 
11b30 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20 29  pCsr->azArg[1] )
11b40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
11b50 69 6e 74 66 28 26 61 63 63 2c 20 22 25 51 2e 22  intf(&acc, "%Q."
11b60 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  , pCsr->azArg[1]
11b70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11b80 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
11b90 6c 28 26 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e  l(&acc, pTab->pN
11ba0 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  ame->zName);.  i
11bb0 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30  f( pCsr->azArg[0
11bc0 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
11bd0 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 3d  XPrintf(&acc, "=
11be0 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  %Q", pCsr->azArg
11bf0 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  [0]);.  }.  zSql
11c00 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
11c10 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a  umFinish(&acc);.
11c20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
11c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11c40 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  MEM;.  rc = sqli
11c50 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
11c60 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  Tab->db, zSql, -
11c70 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d  1, &pCsr->pPragm
11c80 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  a, 0);.  sqlite3
11c90 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
11ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11cb0 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61   ){.    pTab->ba
11cc0 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
11cd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
11ce0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
11cf0 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20  g(pTab->db));.  
11d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11d10 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61  .  return pragma
11d20 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43 75  VtabNext(pVtabCu
11d30 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsor);.}../*.** 
11d40 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
11d50 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66  able module xEof
11d60 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
11d70 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
11d80 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61  bEof(sqlite3_vta
11d90 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
11da0 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61  ursor){.  Pragma
11db0 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
11dc0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
11dd0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
11de0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73  r;.  return (pCs
11df0 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a  r->pPragma==0);.
11e00 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d  }../* The xColum
11e10 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20  n method simply 
11e20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72  returns the corr
11e30 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
11e40 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41   from.** the PRA
11e50 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  GMA.  .*/.static
11e60 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
11e70 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33  olumn(.  sqlite3
11e80 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
11e90 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71  tabCursor, .  sq
11ea0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
11eb0 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a  tx, .  int i.){.
11ec0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
11ed0 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
11ee0 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
11ef0 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61  tabCursor;.  Pra
11f00 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
11f10 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56  (PragmaVtab*)(pV
11f20 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
11f30 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d  );.  if( i<pTab-
11f40 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20  >iHidden ){.    
11f50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
11f60 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
11f70 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
11f80 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29  Csr->pPragma, i)
11f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11fa0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
11fb0 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61  ext(ctx, pCsr->a
11fc0 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69  zArg[i-pTab->iHi
11fd0 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f  dden],-1,SQLITE_
11fe0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
11ff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12000 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  OK;.}../* .** Pr
12010 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
12020 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64  le module xRowid
12030 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
12040 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12050 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  bRowid(sqlite3_v
12060 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
12070 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f  bCursor, sqlite_
12080 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61  int64 *p){.  Pra
12090 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
120a0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
120b0 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
120c0 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73  rsor;.  *p = pCs
120d0 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74  r->iRowid;.  ret
120e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
120f0 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20  ../* The pragma 
12100 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
12110 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ject */.static c
12120 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
12130 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f  ule pragmaVtabMo
12140 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20  dule = {.  0,   
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
12170 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
121a0 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62 6c   - create a tabl
121b0 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  e */.  pragmaVta
121c0 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  bConnect,       
121d0 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
121e0 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20  - connect to an 
121f0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a  existing table *
12200 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42 65  /.  pragmaVtabBe
12210 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  stIndex,        
12220 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d   /* xBestIndex -
12230 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63   Determine searc
12240 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
12250 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e  pragmaVtabDiscon
12260 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
12270 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69  xDisconnect - Di
12280 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20  sconnect from a 
12290 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20  table */.  0,   
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74          /* xDest
122c0 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62  roy - Drop a tab
122d0 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
122e0 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  abOpen,         
122f0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
12300 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
12310 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f  .  pragmaVtabClo
12320 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
12330 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
12340 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
12350 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72  pragmaVtabFilter
12360 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12370 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
12380 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
12390 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61  ints */.  pragma
123a0 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20  VtabNext,       
123b0 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
123c0 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
123d0 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
123e0 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  abEof,          
123f0 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a       /* xEof */.
12400 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75    pragmaVtabColu
12410 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
12420 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
12430 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d   data */.  pragm
12440 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20  aVtabRowid,     
12450 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
12460 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
12470 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72 69  /* xUpdate - wri
124a0 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  te data */.  0, 
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
124d0 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e  gin - begin tran
124e0 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
12510 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61  nc - sync transa
12520 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
12550 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e  it - commit tran
12560 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
12590 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63  llback - rollbac
125a0 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  k transaction */
125b0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  /* xFindFunction
125e0 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72   - function over
125f0 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20  loading */.  0, 
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
12620 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68  name - rename th
12630 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  e table */.  0, 
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
12660 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
12690 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20  lease */.  0    
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
126c0 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  backTo */.};../*
126d0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
126e0 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20   if zTabName is 
126f0 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20  really the name 
12700 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66  of a pragma.  If
12710 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20   it is,.** then 
12720 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e  register an epon
12730 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
12740 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72 61  ble for that pra
12750 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  gma and return.*
12760 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
12770 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74  he Module object
12780 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72   for the new vir
12790 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d  tual table..*/.M
127a0 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72  odule *sqlite3Pr
127b0 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65 72  agmaVtabRegister
127c0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
127d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
127e0 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
127f0 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61  Name *pName;.  a
12800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73  ssert( sqlite3_s
12810 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  trnicmp(zName, "
12820 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20  pragma_", 7)==0 
12830 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61  );.  pName = pra
12840 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b  gmaLocate(zName+
12850 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d  7);.  if( pName=
12860 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12870 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72   if( (pName->mPr
12880 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
12890 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67  _Result0|PragFlg
128a0 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20  _Result1))==0 ) 
128b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
128c0 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
128d0 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
128e0 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20  , zName)==0 );. 
128f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
12900 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28  tabCreateModule(
12910 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67  db, zName, &prag
12920 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76  maVtabModule, (v
12930 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a  oid*)pName, 0);.
12940 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
12950 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12960 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66  TABLE */..#endif
12970 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12980 50 52 41 47 4d 41 20 2a 2f 0a                    PRAGMA */.