/ Hex Artifact Content
Login

Artifact bbe1ba394629ae81c332d76a2c454635fcc76608cea02c7ad24a647ee16398d4:


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 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 49 73 52 65 75 73 65 53 63 68 65 6d 61 28  ( IsReuseSchema(
34f0: 64 62 29 20 26 26 20 28 7a 44 62 20 7c 7c 20 28  db) && (zDb || (
3500: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3510: 67 20 26 20 50 72 61 67 46 6c 67 5f 4f 6e 65 53  g & PragFlg_OneS
3520: 63 68 65 6d 61 29 29 20 29 7b 0a 20 20 20 20 20  chema)) ){.     
3530: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
3540: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
3550: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
3560: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  rc = sqlite3Sche
3570: 6d 61 4c 6f 61 64 28 64 62 2c 20 69 44 62 2c 20  maLoad(db, iDb, 
3580: 30 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  0, &pParse->zErr
3590: 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Msg);.      if( 
35a0: 70 50 61 72 73 65 2d 3e 72 63 20 29 20 67 6f 74  pParse->rc ) got
35b0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
35c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
35d0: 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
35e0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
35f0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
3600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3610: 52 65 67 69 73 74 65 72 20 74 68 65 20 72 65 73  Register the res
3620: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ult column names
3630: 20 66 6f 72 20 70 72 61 67 6d 61 73 20 74 68 61   for pragmas tha
3640: 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 73  t return results
3650: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67   */.  if( (pPrag
3660: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
3670: 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73  ragFlg_NoColumns
3680: 29 3d 3d 30 20 0a 20 20 20 26 26 20 28 28 70 50  )==0 .   && ((pP
3690: 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
36a0: 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  & PragFlg_NoColu
36b0: 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a 52 69 67  mns1)==0 || zRig
36c0: 68 74 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  ht==0).  ){.    
36d0: 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43  setPragmaResultC
36e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50  olumnNames(v, pP
36f0: 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ragma);.  }..  /
3700: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70  * Jump to the ap
3710: 70 72 6f 70 72 69 61 74 65 20 70 72 61 67 6d 61  propriate pragma
3720: 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 73 77   handler */.  sw
3730: 69 74 63 68 28 20 70 50 72 61 67 6d 61 2d 3e 65  itch( pPragma->e
3740: 50 72 61 67 54 79 70 20 29 7b 0a 20 20 0a 23 69  PragTyp ){.  .#i
3750: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3760: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
3770: 47 4d 41 53 29 20 26 26 20 21 64 65 66 69 6e 65  GMAS) && !define
3780: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
3790: 50 52 45 43 41 54 45 44 29 0a 20 20 2f 2a 0a 20  PRECATED).  /*. 
37a0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
37b0: 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63  ema.]default_cac
37c0: 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
37d0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65  AGMA [schema.]de
37e0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
37f0: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
3800: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
3810: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
3820: 70 65 72 73 69 73 74 65 6e 74 20 73 65 74 74 69  persistent setti
3830: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
3840: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
3850: 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75    The value retu
3860: 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69  rned is the maxi
3870: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
3880: 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
3890: 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65  page cache.  The
38a0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
38b0: 73 20 62 6f 74 68 20 74 68 65 20 63 75 72 72 65  s both the curre
38c0: 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  nt.  ** page cac
38d0: 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e  he size value an
38e0: 64 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  d the persistent
38f0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
3900: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72   value.  ** stor
3910: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
3920: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20  se file..  **.  
3930: 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73 69 6f 6e  ** Older version
3940: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 6f 75 6c  s of SQLite woul
3950: 64 20 73 65 74 20 74 68 65 20 64 65 66 61 75 6c  d set the defaul
3960: 74 20 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  t cache size to 
3970: 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 20  a.  ** negative 
3980: 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64 69 63 61  number to indica
3990: 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  te synchronous=O
39a0: 46 46 2e 20 20 54 68 65 73 65 20 64 61 79 73 2c  FF.  These days,
39b0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a   synchronous.  *
39c0: 2a 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 20 62  * is always on b
39d0: 79 20 64 65 66 61 75 6c 74 20 72 65 67 61 72 64  y default regard
39e0: 6c 65 73 73 20 6f 66 20 74 68 65 20 73 69 67 6e  less of the sign
39f0: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
3a00: 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 2e  cache.  ** size.
3a10: 20 20 42 75 74 20 63 6f 6e 74 69 6e 75 65 20 74    But continue t
3a20: 6f 20 74 61 6b 65 20 74 68 65 20 61 62 73 6f 6c  o take the absol
3a30: 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ute value of the
3a40: 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20   default cache. 
3a50: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68 69 73 74   ** size of hist
3a60: 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
3a70: 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  lity..  */.  cas
3a80: 65 20 50 72 61 67 54 79 70 5f 44 45 46 41 55 4c  e PragTyp_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a  T_CACHE_SIZE: {.
3aa0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
3ab0: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
3ac0: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
3ad0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
3ae0: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 67 65  st VdbeOpList ge
3af0: 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b  tCacheSize[] = {
3b00: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e  .      { OP_Tran
3b10: 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 20  saction, 0, 0,  
3b20: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20        0},       
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
3b50: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
3b60: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 42    0, 1,        B
3b70: 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  TREE_DEFAULT_CAC
3b80: 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a 20 31 20  HE_SIZE},  /* 1 
3b90: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  */.      { OP_If
3ba0: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3bb0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3bc0: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3bd0: 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
3be0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
3bf0: 53 75 62 74 72 61 63 74 2c 20 20 20 20 31 2c 20  Subtract,    1, 
3c00: 32 2c 20 20 20 20 20 20 20 20 31 7d 2c 0a 20 20  2,        1},.  
3c10: 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20      { OP_IfPos, 
3c20: 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20        1, 8,     
3c30: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
3c40: 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30  P_Integer,     0
3c50: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 1,        0}, 
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 20 20 2f 2a 20 36 20 2a 2f 0a          /* 6 */.
3c80: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f 6f 70 2c        { OP_Noop,
3c90: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
3ca0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
3cb0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20   OP_ResultRow,  
3cc0: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   1, 1,        0}
3cd0: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
3ce0: 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 73 71  eOp *aOp;.    sq
3cf0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
3d00: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
3d10: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
3d20: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
3d30: 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  m += 2;.      sq
3d40: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
3d50: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
3d60: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74  v, ArraySize(get
3d70: 43 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 20  CacheSize));.   
3d80: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
3d90: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
3da0: 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61   ArraySize(getCa
3db0: 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63  cheSize), getCac
3dc0: 68 65 53 69 7a 65 2c 20 69 4c 6e 29 3b 0a 20 20  heSize, iLn);.  
3dd0: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
3de0: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
3df0: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
3e00: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
3e10: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
3e20: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
3e30: 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31 20 3d 20      aOp[6].p1 = 
3e40: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
3e50: 41 43 48 45 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ACHE_SIZE;.    }
3e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
3e70: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 62  size = sqlite3Ab
3e80: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
3e90: 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  oi(zRight));.   
3ea0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
3eb0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
3ec0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
3ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3ee0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
3ef0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
3f00: 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  EE_DEFAULT_CACHE
3f10: 5f 53 49 5a 45 2c 20 73 69 7a 65 29 3b 0a 20 20  _SIZE, size);.  
3f20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3f30: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
3f40: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
3f50: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63  ;.      pDb->pSc
3f60: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
3f70: 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73   = size;.      s
3f80: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
3f90: 63 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74  cheSize(pDb->pBt
3fa0: 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  , pDb->pSchema->
3fb0: 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20  cache_size);.   
3fc0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
3fd0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3fe0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
3ff0: 52 41 47 4d 41 53 20 26 26 20 21 53 51 4c 49 54  RAGMAS && !SQLIT
4000: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
4010: 44 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  D */..#if !defin
4020: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
4030: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 0a 20 20  AGER_PRAGMAS).  
4040: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
4050: 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73 69  [schema.]page_si
4060: 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
4070: 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73 69  [schema.]page_si
4080: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
4090: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
40a0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
40b0: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  t setting for th
40c0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
40d0: 70 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74  page size in byt
40e0: 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  es.  The second 
40f0: 66 6f 72 6d 20 73 65 74 73 20 74 68 65 0a 20 20  form sets the.  
4100: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
4110: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 54 68   size value.  Th
4120: 65 20 76 61 6c 75 65 20 63 61 6e 20 6f 6e 6c 79  e value can only
4130: 20 62 65 20 73 65 74 20 69 66 0a 20 20 2a 2a 20   be set if.  ** 
4140: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
4150: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 72   not yet been cr
4160: 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  eated..  */.  ca
4170: 73 65 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f  se PragTyp_PAGE_
4180: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 42 74 72 65  SIZE: {.    Btre
4190: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
41a0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
41b0: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
41c0: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
41d0: 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 41 4c 57    int size = ALW
41e0: 41 59 53 28 70 42 74 29 20 3f 20 73 71 6c 69 74  AYS(pBt) ? sqlit
41f0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
4200: 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a 20 20 20  ze(pBt) : 0;.   
4210: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
4220: 6e 74 28 76 2c 20 73 69 7a 65 29 3b 0a 20 20 20  nt(v, size);.   
4230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
4240: 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66 61 69 6c   Malloc may fail
4250: 20 77 68 65 6e 20 73 65 74 74 69 6e 67 20 74 68   when setting th
4260: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 73 20  e page-size, as 
4270: 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65  there is an inte
4280: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 62 75  rnal.      ** bu
4290: 66 66 65 72 20 74 68 61 74 20 74 68 65 20 70 61  ffer that the pa
42a0: 67 65 72 20 6d 6f 64 75 6c 65 20 72 65 73 69 7a  ger module resiz
42b0: 65 73 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  es using sqlite3
42c0: 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20 20 20 20  _realloc()..    
42d0: 20 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6e    */.      db->n
42e0: 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 73 71  extPagesize = sq
42f0: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
4300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
4310: 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74  ITE_NOMEM==sqlit
4320: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
4330: 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74  ze(pBt, db->next
4340: 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30 29 20 29  Pagesize,-1,0) )
4350: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4360: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
4370: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4380: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4390: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
43a0: 73 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64  schema.]secure_d
43b0: 65 6c 65 74 65 0a 20 20 2a 2a 20 20 50 52 41 47  elete.  **  PRAG
43c0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75  MA [schema.]secu
43d0: 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46 46  re_delete=ON/OFF
43e0: 2f 46 41 53 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  /FAST.  **.  ** 
43f0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
4400: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
4410: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
4420: 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64  he.  ** secure_d
4430: 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65  elete flag.  The
4440: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61   second form cha
4450: 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65 5f  nges the secure_
4460: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67  delete.  ** flag
4470: 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70   setting and rep
4480: 6f 72 74 73 20 74 68 65 20 6e 65 77 20 76 61 6c  orts the new val
4490: 75 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ue..  */.  case 
44a0: 50 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f 44  PragTyp_SECURE_D
44b0: 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74 72  ELETE: {.    Btr
44c0: 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70  ee *pBt = pDb->p
44d0: 42 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d 20  Bt;.    int b = 
44e0: 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
44f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  pBt!=0 );.    if
4500: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
4510: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
4520: 72 69 63 6d 70 28 7a 52 69 67 68 74 2c 20 22 66  ricmp(zRight, "f
4530: 61 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ast")==0 ){.    
4540: 20 20 20 20 62 20 3d 20 32 3b 0a 20 20 20 20 20      b = 2;.     
4550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4560: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42 6f  b = sqlite3GetBo
4570: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29  olean(zRight, 0)
4580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4590: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
45a0: 3d 30 20 26 26 20 62 3e 3d 30 20 29 7b 0a 20 20  =0 && b>=0 ){.  
45b0: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
45c0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
45d0: 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
45e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
45f0: 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
4600: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
4610: 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   b);.      }.   
4620: 20 7d 0a 20 20 20 20 62 20 3d 20 73 71 6c 69 74   }.    b = sqlit
4630: 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
4640: 65 74 65 28 70 42 74 2c 20 62 29 3b 0a 20 20 20  ete(pBt, b);.   
4650: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
4660: 28 76 2c 20 62 29 3b 0a 20 20 20 20 62 72 65 61  (v, b);.    brea
4670: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
4680: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4690: 61 2e 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  a.]max_page_coun
46a0: 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  t.  **  PRAGMA [
46b0: 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65  schema.]max_page
46c0: 5f 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a 0a 20 20  _count=N.  **.  
46d0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
46e0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
46f0: 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  rrent setting fo
4700: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d  r the.  ** maxim
4710: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
4720: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
4730: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 0a 20  se file.  The . 
4740: 20 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20   ** second form 
4750: 61 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61 6e  attempts to chan
4760: 67 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  ge this setting.
4770: 20 20 42 6f 74 68 0a 20 20 2a 2a 20 66 6f 72 6d    Both.  ** form
4780: 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  s return the cur
4790: 72 65 6e 74 20 73 65 74 74 69 6e 67 2e 0a 20 20  rent setting..  
47a0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 62 73 6f  **.  ** The abso
47b0: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 4e 20  lute value of N 
47c0: 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20 69  is used.  This i
47d0: 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 61  s undocumented a
47e0: 6e 64 20 6d 69 67 68 74 0a 20 20 2a 2a 20 63 68  nd might.  ** ch
47f0: 61 6e 67 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ange.  The only 
4800: 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 70 72  purpose is to pr
4810: 6f 76 69 64 65 20 61 6e 20 65 61 73 79 20 77 61  ovide an easy wa
4820: 79 20 74 6f 20 74 65 73 74 0a 20 20 2a 2a 20 74  y to test.  ** t
4830: 68 65 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74  he sqlite3AbsInt
4840: 33 32 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  32() function.. 
4850: 20 2a 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   **.  **  PRAGMA
4860: 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 63   [schema.]page_c
4870: 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ount.  **.  ** R
4880: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
4890: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
48a0: 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62   specified datab
48b0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
48c0: 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f 43 4f   PragTyp_PAGE_CO
48d0: 55 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  UNT: {.    int i
48e0: 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Reg;.    sqlite3
48f0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
4900: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
4910: 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72     iReg = ++pPar
4920: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
4930: 28 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  ( sqlite3Tolower
4940: 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 70 27 20  (zLeft[0])=='p' 
4950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4970: 5f 50 61 67 65 63 6f 75 6e 74 2c 20 69 44 62 2c  _Pagecount, iDb,
4980: 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
4990: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
49a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
49b0: 5f 4d 61 78 50 67 63 6e 74 2c 20 69 44 62 2c 20  _MaxPgcnt, iDb, 
49c0: 69 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20 20  iReg, .         
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
49e0: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73  qlite3AbsInt32(s
49f0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
4a00: 74 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t)));.    }.    
4a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a20: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
4a30: 77 2c 20 69 52 65 67 2c 20 31 29 3b 0a 20 20 20  w, iReg, 1);.   
4a40: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4a50: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
4a60: 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f  schema.]locking_
4a70: 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  mode.  **  PRAGM
4a80: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69  A [schema.]locki
4a90: 6e 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f 72 6d 61  ng_mode = (norma
4aa0: 6c 7c 65 78 63 6c 75 73 69 76 65 29 0a 20 20 2a  l|exclusive).  *
4ab0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
4ac0: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3a 20 7b  _LOCKING_MODE: {
4ad0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4ae0: 2a 7a 52 65 74 20 3d 20 22 6e 6f 72 6d 61 6c 22  *zRet = "normal"
4af0: 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20  ;.    int eMode 
4b00: 3d 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  = getLockingMode
4b10: 28 7a 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 69  (zRight);..    i
4b20: 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26  f( pId2->n==0 &&
4b30: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4b40: 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 20  CKINGMODE_QUERY 
4b50: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6d 70  ){.      /* Simp
4b60: 6c 65 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69  le "PRAGMA locki
4b70: 6e 67 5f 6d 6f 64 65 3b 22 20 73 74 61 74 65 6d  ng_mode;" statem
4b80: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 71  ent. This is a q
4b90: 75 65 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  uery for.      *
4ba0: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 65  * the current de
4bb0: 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 6d 6f  fault locking mo
4bc0: 64 65 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  de (which may be
4bd0: 20 64 69 66 66 65 72 65 6e 74 20 74 6f 0a 20 20   different to.  
4be0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 69      ** the locki
4bf0: 6e 67 2d 6d 6f 64 65 20 6f 66 20 74 68 65 20 6d  ng-mode of the m
4c00: 61 69 6e 20 64 61 74 61 62 61 73 65 29 2e 0a 20  ain database).. 
4c10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65 4d       */.      eM
4c20: 6f 64 65 20 3d 20 64 62 2d 3e 64 66 6c 74 4c 6f  ode = db->dfltLo
4c30: 63 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73  ckMode;.    }els
4c40: 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  e{.      Pager *
4c50: 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 69 66  pPager;.      if
4c60: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a  ( pId2->n==0 ){.
4c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
4c80: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6e  indicates that n
4c90: 6f 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  o database name 
4ca0: 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61 73  was specified as
4cb0: 20 70 61 72 74 0a 20 20 20 20 20 20 20 20 2a 2a   part.        **
4cc0: 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 63   of the PRAGMA c
4cd0: 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 69 73 20  ommand. In this 
4ce0: 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  case the locking
4cf0: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 0a 20 20  -mode must be.  
4d00: 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20        ** set on 
4d10: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
4d20: 61 62 61 73 65 73 2c 20 61 73 20 77 65 6c 6c 20  abases, as well 
4d30: 61 73 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66  as the main db f
4d40: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ile..        **.
4d50: 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 2c          ** Also,
4d60: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 64 66 6c   the sqlite3.dfl
4d70: 74 4c 6f 63 6b 4d 6f 64 65 20 76 61 72 69 61 62  tLockMode variab
4d80: 6c 65 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  le is set so tha
4d90: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  t.        ** any
4da0: 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 61 74   subsequently at
4db0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
4dc0: 20 61 6c 73 6f 20 75 73 65 20 74 68 65 20 73 70   also use the sp
4dd0: 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 20 20  ecified.        
4de0: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  ** locking mode.
4df0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
4e00: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
4e10: 20 20 20 20 61 73 73 65 72 74 28 70 44 62 3d 3d      assert(pDb==
4e20: 26 64 62 2d 3e 61 44 62 5b 30 5d 29 3b 0a 20 20  &db->aDb[0]);.  
4e30: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 3b 20        for(ii=2; 
4e40: 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
4e50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
4e60: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
4e70: 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
4e80: 69 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20  ii].pBt);.      
4e90: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
4ea0: 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67  LockingMode(pPag
4eb0: 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  er, eMode);.    
4ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62      }.        db
4ed0: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d  ->dfltLockMode =
4ee0: 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20 20   (u8)eMode;.    
4ef0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
4f00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
4f10: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
4f20: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 73 71        eMode = sq
4f30: 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
4f40: 67 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d  gMode(pPager, eM
4f50: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ode);.    }..   
4f60: 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
4f70: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4f80: 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
4f90: 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
4fa0: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
4fb0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
4fc0: 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47    if( eMode==PAG
4fd0: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
4fe0: 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
4ff0: 20 20 7a 52 65 74 20 3d 20 22 65 78 63 6c 75 73    zRet = "exclus
5000: 69 76 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive";.    }.    
5010: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
5020: 28 76 2c 20 7a 52 65 74 29 3b 0a 20 20 20 20 62  (v, zRet);.    b
5030: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
5040: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
5050: 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f  hema.]journal_mo
5060: 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  de.  **  PRAGMA 
5070: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
5080: 5f 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20 20  _mode =.  **    
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69 73    (delete|persis
50b0: 74 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c 6d  t|off|truncate|m
50c0: 65 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a 20  emory|wal|off). 
50d0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
50e0: 79 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f 44 45 3a  yp_JOURNAL_MODE:
50f0: 20 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65   {.    int eMode
5100: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
5110: 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55  of the PAGER_JOU
5120: 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79 6d  RNALMODE_XXX sym
5130: 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bols */.    int 
5140: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ii;           /*
5150: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
5160: 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ..    if( zRight
5170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
5180: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  If there is no "
5190: 3d 4d 4f 44 45 22 20 70 61 72 74 20 6f 66 20 74  =MODE" part of t
51a0: 68 65 20 70 72 61 67 6d 61 2c 20 64 6f 20 61 20  he pragma, do a 
51b0: 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20  query for the.  
51c0: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6d      ** current m
51d0: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 65 4d 6f  ode */.      eMo
51e0: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
51f0: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
5210: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
5220: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
5230: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5240: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 66  zRight);.      f
5250: 6f 72 28 65 4d 6f 64 65 3d 30 3b 20 28 7a 4d 6f  or(eMode=0; (zMo
5260: 64 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  de = sqlite3Jour
5270: 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4d 6f 64  nalModename(eMod
5280: 65 29 29 21 3d 30 3b 20 65 4d 6f 64 65 2b 2b 29  e))!=0; eMode++)
5290: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
52a0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52  lite3StrNICmp(zR
52b0: 69 67 68 74 2c 20 7a 4d 6f 64 65 2c 20 6e 29 3d  ight, zMode, n)=
52c0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
52d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a    }.      if( !z
52e0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
52f0: 2f 2a 20 49 66 20 74 68 65 20 22 3d 4d 4f 44 45  /* If the "=MODE
5300: 22 20 70 61 72 74 20 64 6f 65 73 20 6e 6f 74 20  " part does not 
5310: 6d 61 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e 20  match any known 
5320: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 0a 20 20  journal mode,.  
5330: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 6f        ** then do
5340: 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20   a query */.    
5350: 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45      eMode = PAGE
5360: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
5370: 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ERY;.      }.   
5380: 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65   }.    if( eMode
5390: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
53a0: 4f 44 45 5f 51 55 45 52 59 20 26 26 20 70 49 64  ODE_QUERY && pId
53b0: 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  2->n==0 ){.     
53c0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52 41   /* Convert "PRA
53d0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
53e0: 22 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20 6d  " into "PRAGMA m
53f0: 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ain.journal_mode
5400: 22 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20 3d  " */.      iDb =
5410: 20 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d 3e   0;.      pId2->
5420: 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 1;.    }.   
5430: 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d   for(ii=db->nDb-
5440: 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b  1; ii>=0; ii--){
5450: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
5460: 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28 69  Db[ii].pBt && (i
5470: 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e  i==iDb || pId2->
5480: 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  n==0) ){.       
5490: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
54a0: 42 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20 20  Btree(v, ii);.  
54b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
54c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 6f  eAddOp3(v, OP_Jo
54d0: 75 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20 31  urnalMode, ii, 1
54e0: 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
54f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
5500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5510: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
5520: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
5530: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
5540: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
5550: 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69  ]journal_size_li
5560: 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  mit.  **  PRAGMA
5570: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5580: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a 20  l_size_limit=N. 
5590: 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20   **.  ** Get or 
55a0: 73 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69 6d  set the size lim
55b0: 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a  it on rollback j
55c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20 20  ournal files..  
55d0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
55e0: 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  p_JOURNAL_SIZE_L
55f0: 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67 65  IMIT: {.    Page
5600: 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
5610: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
5620: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36 34  b->pBt);.    i64
5630: 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20 20   iLimit = -2;.  
5640: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
5650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 63        sqlite3Dec
5660: 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68  OrHexToI64(zRigh
5670: 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20 20  t, &iLimit);.   
5680: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d 31     if( iLimit<-1
5690: 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a   ) iLimit = -1;.
56a0: 20 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69 74      }.    iLimit
56b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a   = sqlite3PagerJ
56c0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28  ournalSizeLimit(
56d0: 70 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29 3b  pPager, iLimit);
56e0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
56f0: 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29 3b  eInt(v, iLimit);
5700: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
5710: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5720: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
5730: 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  GMAS */..  /*.  
5740: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
5750: 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d 0a  ma.]auto_vacuum.
5760: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
5770: 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75  hema.]auto_vacuu
5780: 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65  m=N.  **.  ** Ge
5790: 74 20 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c  t or set the val
57a0: 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
57b0: 73 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  se 'auto-vacuum'
57c0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2a   parameter..  **
57d0: 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f 6e   The value is on
57e0: 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31 20  e of:  0 NONE 1 
57f0: 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e 54  FULL 2 INCREMENT
5800: 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  AL.  */.#ifndef 
5810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
5820: 56 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72  VACUUM.  case Pr
5830: 61 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55 55  agTyp_AUTO_VACUU
5840: 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  M: {.    Btree *
5850: 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a  pBt = pDb->pBt;.
5860: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21      assert( pBt!
5870: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  =0 );.    if( !z
5880: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
5890: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
58a0: 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  , sqlite3BtreeGe
58b0: 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 29  tAutoVacuum(pBt)
58c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
58d0: 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d 20      int eAuto = 
58e0: 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a 52  getAutoVacuum(zR
58f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73  ight);.      ass
5900: 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26 26  ert( eAuto>=0 &&
5910: 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20 20   eAuto<=2 );.   
5920: 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76     db->nextAutov
5930: 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b 0a  ac = (u8)eAuto;.
5940: 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53 65        /* Call Se
5950: 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74 6f  tAutoVacuum() to
5960: 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65 20   set initialize 
5970: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75 74  the internal aut
5980: 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  o and.      ** i
5990: 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67 73  ncr-vacuum flags
59a0: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
59b0: 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ed in case this 
59c0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
59d0: 20 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65 20   ** creates the 
59e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
59f0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
5a00: 68 61 74 20 69 74 20 69 73 20 63 72 65 61 74 65  hat it is create
5a10: 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e  d.      ** as an
5a20: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
5a30: 61 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20 2a  able db..      *
5a40: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
5a50: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
5a60: 56 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75 74  Vacuum(pBt, eAut
5a70: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
5a80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
5a90: 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75 74  eAuto==1 || eAut
5aa0: 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20 20  o==2) ){.       
5ab0: 20 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e 67   /* When setting
5ac0: 20 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75 6d   the auto_vacuum
5ad0: 20 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72 20   mode to either 
5ae0: 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20 20  "full" or .     
5af0: 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e 74     ** "increment
5b00: 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20 76  al", write the v
5b10: 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d 20  alue of meta[6] 
5b20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
5b30: 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
5b40: 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
5b50: 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65 63  to meta[6], chec
5b60: 6b 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20 69  k that meta[3] i
5b70: 6e 64 69 63 61 74 65 73 0a 20 20 20 20 20 20 20  ndicates.       
5b80: 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 65   ** that this re
5b90: 61 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f 2d  ally is an auto-
5ba0: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64  vacuum capable d
5bb0: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
5bc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74   */.        stat
5bd0: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
5be0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
5bf0: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20  INENO(2);.      
5c00: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56    static const V
5c10: 64 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65 74  dbeOpList setMet
5c20: 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  a6[] = {.       
5c30: 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74     { OP_Transact
5c40: 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20 20  ion,    0,      
5c50: 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
5c60: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c70: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  0 */.          {
5c80: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
5c90: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 31      0,         1
5ca0: 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f  ,         BTREE_
5cb0: 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47  LARGEST_ROOT_PAG
5cc0: 45 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b 20  E},.          { 
5cd0: 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20 20  OP_If,          
5ce0: 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 30 2c     1,         0,
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a   0},    /* 2 */.
5d10: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 48            { OP_H
5d20: 61 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20 53  alt,           S
5d30: 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62 6f  QLITE_OK, OE_Abo
5d40: 72 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d 2c  rt,          0},
5d50: 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20      /* 3 */.    
5d60: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f        { OP_SetCo
5d70: 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 20  okie,      0,   
5d80: 20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43 52        BTREE_INCR
5d90: 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20 20  _VACUUM, 0},    
5da0: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 4 */.        
5db0: 7d 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  };.        VdbeO
5dc0: 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *aOp;.        
5dd0: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
5de0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
5df0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
5e00: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
5e10: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
5e20: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65  (v, ArraySize(se
5e30: 74 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20 20  tMeta6));.      
5e40: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
5e50: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
5e60: 41 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65 74  ArraySize(setMet
5e70: 61 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20 69  a6), setMeta6, i
5e80: 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ln);.        if(
5e90: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
5ea0: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
5eb0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
5ec0: 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62   aOp[0].p1 = iDb
5ed0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31 5d  ;.        aOp[1]
5ee0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5ef0: 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20 69     aOp[2].p2 = i
5f00: 41 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20 20  Addr+4;.        
5f10: 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[4].p1 = iDb;
5f20: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5f30: 70 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b 0a  p3 = eAuto - 1;.
5f40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5f50: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
5f60: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
5f70: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
5f80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
5f90: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
5fa0: 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74 61  hema.]incrementa
5fb0: 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a 2a  l_vacuum(N).  **
5fc0: 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70 73  .  ** Do N steps
5fd0: 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   of incremental 
5fe0: 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20 64  vacuuming on a d
5ff0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
6000: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6010: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63  T_AUTOVACUUM.  c
6020: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43 52  ase PragTyp_INCR
6030: 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a 20  EMENTAL_VACUUM: 
6040: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  {.    int iLimit
6050: 2c 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28 20  , addr;.    if( 
6060: 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73 71  zRight==0 || !sq
6070: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52  lite3GetInt32(zR
6080: 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20 7c  ight, &iLimit) |
6090: 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20  | iLimit<=0 ){. 
60a0: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30 78       iLimit = 0x
60b0: 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d 0a  7fffffff;.    }.
60c0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
60d0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
60e0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
60f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6100: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6110: 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b  ger, iLimit, 1);
6120: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
6130: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6140: 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c 20   OP_IncrVacuum, 
6150: 69 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72 61  iDb); VdbeCovera
6160: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
6170: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6180: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 29  OP_ResultRow, 1)
6190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
61a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
61b0: 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20 20  dImm, 1, -1);.  
61c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
61d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
61e0: 20 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43   1, addr); VdbeC
61f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6200: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6210: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
6220: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
6230: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
6240: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
6250: 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a  RAGMAS.  /*.  **
6260: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
6270: 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  .]cache_size.  *
6280: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
6290: 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a  a.]cache_size=N.
62a0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
62b0: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
62c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
62d0: 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  al setting for t
62e0: 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
62f0: 68 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63  he size. The sec
6300: 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68  ond form sets th
6310: 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67  e local.  ** pag
6320: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
6330: 75 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f 73  ue.  If N is pos
6340: 69 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20  itive then that 
6350: 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  is the.  ** numb
6360: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
6370: 68 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20  he cache.  If N 
6380: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6390: 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  n the.  ** numbe
63a0: 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64  r of pages is ad
63b0: 6a 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74  justed so that t
63c0: 68 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e  he cache uses -N
63d0: 20 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20   kibibytes.  ** 
63e0: 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a  of memory..  */.
63f0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
6400: 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  ACHE_SIZE: {.   
6410: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6420: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
6430: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
6440: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
6450: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
6460: 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e  ngleInt(v, pDb->
6470: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
6480: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
6490: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
64a0: 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  = sqlite3Atoi(zR
64b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44 62  ight);.      pDb
64c0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
64d0: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
64e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
64f0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
6500: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
6510: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
6520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
6530: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
6540: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
6550: 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a 20  a.]cache_spill. 
6560: 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68   **  PRAGMA cach
6570: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 0a  e_spill=BOOLEAN.
6580: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
6590: 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c  hema.]cache_spil
65a0: 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  l=N.  **.  ** Th
65b0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
65c0: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
65d0: 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66   local setting f
65e0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  or the.  ** page
65f0: 20 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69 7a   cache spill siz
6600: 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  e. The second fo
6610: 72 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20 73  rm turns cache s
6620: 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72 20  pill on.  ** or 
6630: 6f 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e 6e  off.  When turnn
6640: 69 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c 20  ing cache spill 
6650: 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73 20  on, the size is 
6660: 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  set to the.  ** 
6670: 63 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73 69  current cache_si
6680: 7a 65 2e 20 20 54 68 65 20 74 68 69 72 64 20 66  ze.  The third f
6690: 6f 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c 6c  orm sets a spill
66a0: 20 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a 20   size that.  ** 
66b0: 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
66c0: 20 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65 20   form the cache 
66d0: 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e 20  size..  ** If N 
66e0: 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e  is positive then
66f0: 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a   that is the.  *
6700: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
6710: 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20  s in the cache. 
6720: 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76   If N is negativ
6730: 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
6740: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6750: 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20   is adjusted so 
6760: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75  that the cache u
6770: 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73  ses -N kibibytes
6780: 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e  .  ** of memory.
6790: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
67a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
67b0: 65 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69 73  e_spill pages is
67c0: 20 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20 6e   less then the n
67d0: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61  umber of.  ** ca
67e0: 63 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c 20  che_size pages, 
67f0: 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63 75  no spilling occu
6800: 72 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  rs until the pag
6810: 65 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73 0a  e count exceeds.
6820: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
6830: 6f 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61  of cache_size pa
6840: 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ges..  **.  ** T
6850: 68 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42  he cache_spill=B
6860: 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20 61  OOLEAN setting a
6870: 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61 74  pplies to all at
6880: 74 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c 0a  tached schemas,.
6890: 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74 68    ** not just th
68a0: 65 20 73 63 68 65 6d 61 20 73 70 65 63 69 66 69  e schema specifi
68b0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
68c0: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 50  PragTyp_CACHE_SP
68d0: 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65 72  ILL: {.    asser
68e0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
68f0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
6900: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28  b, 0) );.    if(
6910: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
6920: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
6930: 74 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28 64  t(v,.         (d
6940: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6950: 45 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d 30  E_CacheSpill)==0
6960: 20 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20 20   ? 0 : .        
6970: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6980: 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62  SetSpillSize(pDb
6990: 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20 7d  ->pBt,0));.    }
69a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
69b0: 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  size = 1;.      
69c0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
69d0: 74 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69 7a  t32(zRight, &siz
69e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  e) ){.        sq
69f0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
6a00: 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c  llSize(pDb->pBt,
6a10: 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a   size);.      }.
6a20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6a30: 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67  3GetBoolean(zRig
6a40: 68 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b 0a  ht, size!=0) ){.
6a50: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
6a60: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63 68  s |= SQLITE_Cach
6a70: 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  eSpill;.      }e
6a80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  lse{.        db-
6a90: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29  >flags &= ~(u64)
6aa0: 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
6ab0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
6ac0: 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67   setAllPagerFlag
6ad0: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s(db);.    }.   
6ae0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6af0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
6b00: 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a  schema.]mmap_siz
6b10: 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  e(N).  **.  ** U
6b20: 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69  sed to set mappi
6b30: 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54  ng size limit. T
6b40: 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  he mapping size 
6b50: 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73  limit is.  ** us
6b60: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6b70: 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f  aggregate size o
6b80: 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70  f all memory map
6b90: 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74  ped regions of t
6ba0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
6bb0: 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70   file. If this p
6bc0: 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
6bd0: 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65  to zero, then me
6be0: 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a  mory mapping.  *
6bf0: 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74  * is not used at
6c00: 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e   all.  If N is n
6c10: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
6c20: 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79  e default memory
6c30: 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20   map.  ** limit 
6c40: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71  determined by sq
6c50: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
6c60: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f  ITE_CONFIG_MMAP_
6c70: 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20  SIZE) is set..  
6c80: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
6c90: 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20 69   N is measured i
6ca0: 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  n bytes..  **.  
6cb0: 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  ** This value is
6cc0: 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20   advisory.  The 
6cd0: 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69  underlying VFS i
6ce0: 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79  s free to memory
6cf0: 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74   map.  ** as lit
6d00: 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61  tle or as much a
6d10: 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63  s it wants.  Exc
6d20: 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74  ept, if N is set
6d30: 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20   to 0 then the. 
6d40: 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73   ** upper layers
6d50: 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f   will never invo
6d60: 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69 6e  ke the xFetch in
6d70: 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65 20  terfaces to the 
6d80: 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  VFS..  */.  case
6d90: 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49   PragTyp_MMAP_SI
6da0: 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ZE: {.    sqlite
6db0: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20  3_int64 sz;.#if 
6dc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
6dd0: 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72  SIZE>0.    asser
6de0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
6df0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
6e00: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28  b, 0) );.    if(
6e10: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
6e20: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73   int ii;.      s
6e30: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
6e40: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29  I64(zRight, &sz)
6e50: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30  ;.      if( sz<0
6e60: 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47   ) sz = sqlite3G
6e70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
6e80: 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ap;.      if( pI
6e90: 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73  d2->n==0 ) db->s
6ea0: 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20  zMmap = sz;.    
6eb0: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
6ec0: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
6ed0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
6ee0: 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26  ->aDb[ii].pBt &&
6ef0: 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64   (ii==iDb || pId
6f00: 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20  2->n==0) ){.    
6f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6f20: 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64  eeSetMmapLimit(d
6f30: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20  b->aDb[ii].pBt, 
6f40: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sz);.        }. 
6f50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6f60: 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63   sz = -1;.    rc
6f70: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
6f80: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
6f90: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
6fa0: 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23  AP_SIZE, &sz);.#
6fb0: 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b  else.    sz = 0;
6fc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6fd0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  _OK;.#endif.    
6fe0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6ff0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
7000: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 7a  nSingleInt(v, sz
7010: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7020: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
7030: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50  OUND ){.      pP
7040: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
7050: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
7060: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62   rc;.    }.    b
7070: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
7080: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
7090: 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20 20  mp_store.  **   
70a0: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
70b0: 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22 6d  e = "default"|"m
70c0: 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20 20  emory"|"file".  
70d0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
70e0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
70f0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d  value of the tem
7100: 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 43  p_store flag.  C
7110: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7120: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
7130: 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
7140: 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
7150: 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66 61  ile and the defa
7160: 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77  ult.  ** value w
7170: 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
7180: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
7190: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
71a0: 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ened..  **.  ** 
71b0: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
71c0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
71d0: 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65   library compile
71e0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f  -time options to
71f0: 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74  .  ** override t
7200: 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  his setting.  */
7210: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7220: 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20 20  TEMP_STORE: {.  
7230: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7240: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7250: 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74 65  gleInt(v, db->te
7260: 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20 7d  mp_store);.    }
7270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 6e  else{.      chan
7280: 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  geTempStorage(pP
7290: 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a 20  arse, zRight);. 
72a0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
72b0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
72c0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
72d0: 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a  re_directory.  *
72e0: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
72f0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
7300: 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f  = ""|"directory_
7310: 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  name".  **.  ** 
7320: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
7330: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
7340: 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 5f   the temp_store_
7350: 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20  directory flag. 
7360: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
7370: 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20  he value sets a 
7380: 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f  specific directo
7390: 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ry to be used fo
73a0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
73b0: 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67 20  s..  ** Setting 
73c0: 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  to a null string
73d0: 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65 20   reverts to the 
73e0: 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61 72  default temporar
73f0: 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61 72  y directory sear
7400: 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d 70  ch..  ** If temp
7410: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
7420: 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
7430: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
7440: 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  torage..  **.  *
7450: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7460: 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52 45  _TEMP_STORE_DIRE
7470: 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28  CTORY: {.    if(
7480: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
7490: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
74a0: 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74 65  xt(v, sqlite3_te
74b0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
74c0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
74d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
74e0: 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  D.      if( zRig
74f0: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7500: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
7510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7520: 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c  Access(db->pVfs,
7530: 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f   zRight, SQLITE_
7540: 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
7550: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
7560: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7570: 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a  OK || res==0 ){.
7580: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7590: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
75a0: 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c  , "not a writabl
75b0: 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20  e directory");. 
75c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72           goto pr
75d0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
75e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
75f0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d    if( SQLITE_TEM
7600: 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20  P_STORE==0.     
7610: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
7620: 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62  P_STORE==1 && db
7630: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29  ->temp_store<=1)
7640: 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49  .       || (SQLI
7650: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
7660: 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   && db->temp_sto
7670: 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a  re==1).      ){.
7680: 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
7690: 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50  teTempStorage(pP
76a0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
76b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
76c0: 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  e(sqlite3_temp_d
76d0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
76e0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
76f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7700: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7710: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7720: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7730: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
7750: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
7760: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7770: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7780: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
7790: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
77a0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
77b0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
77c0: 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  MA data_store_di
77d0: 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50  rectory.  **   P
77e0: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
77f0: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c  _directory = ""|
7800: 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22  "directory_name"
7810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
7820: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
7830: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
7840: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
7850: 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e  tory flag.  Chan
7860: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61  ging.  ** the va
7870: 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69  lue sets a speci
7880: 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f  fic directory to
7890: 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74   be used for dat
78a0: 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61 74  abase files that
78b0: 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69  .  ** were speci
78c0: 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61  fied with a rela
78d0: 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  tive pathname.  
78e0: 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c  Setting to a nul
78f0: 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73  l string reverts
7900: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66  .  ** to the def
7910: 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64 69  ault database di
7920: 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66  rectory, which f
7930: 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
7940: 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68  s specified with
7950: 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65  .  ** a relative
7960: 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61   path will proba
7970: 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20  bly be based on 
7980: 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65  the current dire
7990: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20  ctory for the.  
79a0: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74  ** process.  Dat
79b0: 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63 69  abase file speci
79c0: 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62 73  fied with an abs
79d0: 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20 6e  olute path are n
79e0: 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a  ot impacted.  **
79f0: 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e 67   by this setting
7a00: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
7a10: 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a  its value..  **.
7a20: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7a30: 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44  Typ_DATA_STORE_D
7a40: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7a50: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7a60: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7a70: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7a80: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29  _data_directory)
7a90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
7aa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ab0: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
7ac0: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7ad0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
7ae0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7af0: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
7b00: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
7b10: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
7b20: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
7b30: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7b40: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7b50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7b60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7b70: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7b80: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
7b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
7ba0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
7bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7bc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7bd0: 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  e(sqlite3_data_d
7be0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20  irectory);.     
7bf0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7c00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7c10: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7c20: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7c30: 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29  tf("%s", zRight)
7c40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7c50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
7c60: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
7c70: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
7c80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7c90: 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _WSD */.    }.  
7ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
7cb0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
7cc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
7cd0: 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TYLE.  /*.  **  
7ce0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7cf0: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7d00: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
7d10: 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f  schema.]lock_pro
7d20: 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f  xy_file = ":auto
7d30: 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61  :"|"lock_file_pa
7d40: 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  th".  **.  ** Re
7d50: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7d60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 63  value of the loc
7d70: 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61  k_proxy_file fla
7d80: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7d90: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7da0: 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c 65   a specific file
7db0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7dc0: 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
7dd0: 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  locks..  **.  */
7de0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7df0: 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a  LOCK_PROXY_FILE:
7e00: 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67   {.    if( !zRig
7e10: 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  ht ){.      Page
7e20: 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
7e30: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
7e40: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 63  b->pBt);.      c
7e50: 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f  har *proxy_file_
7e60: 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  path = NULL;.   
7e70: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7e80: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7e90: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7ea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7eb0: 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
7ec0: 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
7ed0: 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
7ee0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
7f00: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7f10: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
7f20: 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f 78  ngleText(v, prox
7f30: 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20  y_file_path);.  
7f40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
7f50: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7f60: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7f70: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7f80: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7f90: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
7fa0: 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
7fb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b  ;.      int res;
7fc0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
7fd0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
7fe0: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7ff0: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
8000: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
8010: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  zRight);.      }
8050: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
8060: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
8070: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
8080: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
8090: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
80d0: 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53 51       if( res!=SQ
80e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
80f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8100: 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c  sg(pParse, "fail
8110: 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70  ed to set lock p
8120: 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20  roxy file");.   
8130: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
8140: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
8150: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8160: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8170: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
8180: 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20  NG_STYLE */     
8190: 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   .    .  /*.  **
81a0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
81b0: 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  a.]synchronous. 
81c0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
81d0: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
81e0: 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c  s=OFF|ON|NORMAL|
81f0: 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a 0a  FULL|EXTRA.  **.
8200: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
8210: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
8220: 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72  ue of the synchr
8230: 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61  onous flag.  Cha
8240: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c  nging.  ** the l
8250: 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20  ocal value does 
8260: 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73  not make changes
8270: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c   to the disk fil
8280: 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64  e and the.  ** d
8290: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
82a0: 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68  l be restored th
82b0: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
82c0: 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a  database is.  **
82d0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
82e0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e  case PragTyp_SYN
82f0: 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20  CHRONOUS: {.    
8300: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
8310: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
8320: 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61 66  eInt(v, pDb->saf
8330: 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20 20  ety_level-1);.  
8340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8350: 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
8360: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  it ){.        sq
8370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8380: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
8390: 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c     "Safety level
83a0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
83b0: 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72 61  ged inside a tra
83c0: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
83d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62 21    }else if( iDb!
83e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =1 ){.        in
83f0: 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53  t iLevel = (getS
8400: 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68  afetyLevel(zRigh
8410: 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45  t,0,1)+1) & PAGE
8420: 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
8430: 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  SK;.        if( 
8440: 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76  iLevel==0 ) iLev
8450: 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  el = 1;.        
8460: 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
8470: 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20  l = iLevel;.    
8480: 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53 65      pDb->bSyncSe
8490: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
84a0: 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28  etAllPagerFlags(
84b0: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
84c0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
84d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
84e0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
84f0: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8500: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8510: 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73  AG_PRAGMAS.  cas
8520: 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20  e PragTyp_FLAG: 
8530: 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
8540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74  ==0 ){.      set
8550: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
8560: 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67  mnNames(v, pPrag
8570: 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ma);.      retur
8580: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64  nSingleInt(v, (d
8590: 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61 67  b->flags & pPrag
85a0: 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a  ma->iArg)!=0 );.
85b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
85c0: 20 75 36 34 20 6d 61 73 6b 20 3d 20 70 50 72 61   u64 mask = pPra
85d0: 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a  gma->iArg;    /*
85e0: 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 6f   Mask of bits to
85f0: 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a   set or clear. *
8600: 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  /.      if( db->
8610: 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
8620: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65  .        /* Fore
8630: 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20  ign key support 
8640: 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c  may not be enabl
8650: 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77  ed or disabled w
8660: 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20  hile not.       
8670: 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d   ** in auto-comm
8680: 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20  it mode.  */.   
8690: 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53       mask &= ~(S
86a0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
86b0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  s);.      }.#if 
86c0: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
86d0: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
86e0: 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75   if( db->auth.au
86f0: 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55  thLevel==UAUTH_U
8700: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ser ){.        /
8710: 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e  * Do not allow n
8720: 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20 74  on-admin users t
8730: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68  o modify the sch
8740: 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79 20  ema arbitrarily 
8750: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  */.        mask 
8760: 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69 74  &= ~(SQLITE_Writ
8770: 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  eSchema);.      
8780: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
8790: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f  if( sqlite3GetBo
87a0: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29  olean(zRight, 0)
87b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
87c0: 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  flags |= mask;. 
87d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
87e0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
87f0: 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   ~mask;.        
8800: 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45  if( mask==SQLITE
8810: 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d 3e  _DeferFKs ) db->
8820: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
8830: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
8840: 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20       /* Many of 
8850: 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61 73  the flag-pragmas
8860: 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64 65   modify the code
8870: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
8880: 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20  e SQL .      ** 
8890: 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63 6f  compiler (eg. co
88a0: 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f  unt_changes). So
88b0: 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   add an opcode t
88c0: 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20 20  o expire all.   
88d0: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53     ** compiled S
88e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 66  QL statements af
88f0: 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ter modifying a 
8900: 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20  pragma value..  
8910: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
8920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
8930: 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
8940: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
8950: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
8960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
8970: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8980: 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41  OMIT_FLAG_PRAGMA
8990: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
89a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
89b0: 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20  _PRAGMAS.  /*.  
89c0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c  **   PRAGMA tabl
89d0: 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a  e_info(<table>).
89e0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
89f0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f   a single row fo
8a00: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
8a10: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
8a20: 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  . The columns of
8a30: 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  .  ** the return
8a40: 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65 3a  ed data set are:
8a50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20  .  **.  ** cid: 
8a60: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64         Column id
8a70: 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20   (numbered from 
8a80: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 73  left to right, s
8a90: 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20 20  tarting at 0).  
8aa0: 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 43  ** name:       C
8ab0: 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20  olumn name.  ** 
8ac0: 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c 75  type:       Colu
8ad0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  mn declaration t
8ae0: 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c  ype..  ** notnul
8af0: 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27 4e  l:    True if 'N
8b00: 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72 74  OT NULL' is part
8b10: 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61   of column decla
8b20: 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74  ration.  ** dflt
8b30: 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66 61  _value: The defa
8b40: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
8b50: 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79  e column, if any
8b60: 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20 20 20 20  ..  ** pk:      
8b70: 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20     Non-zero for 
8b80: 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  PK fields..  */.
8b90: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54    case PragTyp_T
8ba0: 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66 28 20 7a  ABLE_INFO: if( z
8bb0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 54 61 62  Right ){.    Tab
8bc0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54  le *pTab;.    pT
8bd0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
8be0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
8bf0: 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c 20 7a 52  LOCATE_NOERR, zR
8c00: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
8c10: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
8c20: 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20 73    int iTabDb = s
8c30: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
8c40: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
8c50: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69 6e  chema);.      in
8c60: 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e  t i, k;.      in
8c70: 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20  t nHidden = 0;. 
8c80: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f       Column *pCo
8c90: 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  l;.      Index *
8ca0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
8cb0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
8cc0: 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  b);.      pParse
8cd0: 2d 3e 6e 4d 65 6d 20 3d 20 37 3b 0a 20 20 20 20  ->nMem = 7;.    
8ce0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
8cf0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
8d00: 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20  , iTabDb);.     
8d10: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
8d20: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
8d30: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  e, pTab);.      
8d40: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
8d50: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
8d60: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
8d70: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  l++){.        in
8d80: 74 20 69 73 48 69 64 64 65 6e 20 3d 20 49 73 48  t isHidden = IsH
8d90: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c  iddenColumn(pCol
8da0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
8db0: 73 48 69 64 64 65 6e 20 26 26 20 70 50 72 61 67  sHidden && pPrag
8dc0: 6d 61 2d 3e 69 41 72 67 3d 3d 30 20 29 7b 0a 20  ma->iArg==0 ){. 
8dd0: 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65 6e           nHidden
8de0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
8df0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8e00: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
8e10: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
8e20: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
8e30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8e40: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
8e50: 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d 30  }else if( pPk==0
8e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20   ){.          k 
8e70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
8e80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
8e90: 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d 3e  r(k=1; k<=pTab->
8ea0: 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69 43  nCol && pPk->aiC
8eb0: 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20 6b  olumn[k-1]!=i; k
8ec0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d 0a  ++){}.        }.
8ed0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8ee0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20 7c  pCol->pDflt==0 |
8ef0: 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f  | pCol->pDflt->o
8f00: 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20 20  p==TK_SPAN );.  
8f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f20: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
8f30: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 3f   pPragma->iArg ?
8f40: 20 22 69 73 73 69 73 69 69 22 20 3a 20 22 69 73   "issisii" : "is
8f50: 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20  sisi",.         
8f60: 20 20 20 20 20 20 69 2d 6e 48 69 64 64 65 6e 2c        i-nHidden,
8f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f80: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pCol->zName,.   
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8fa0: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
8fb0: 6f 6c 2c 22 22 29 2c 0a 20 20 20 20 20 20 20 20  ol,""),.        
8fc0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 6e 6f 74         pCol->not
8fd0: 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c 0a 20 20  Null ? 1 : 0,.  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
8ff0: 6c 2d 3e 70 44 66 6c 74 20 3f 20 70 43 6f 6c 2d  l->pDflt ? pCol-
9000: 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pDflt->u.zToken
9010: 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20   : 0,.          
9020: 20 20 20 20 20 6b 2c 0a 20 20 20 20 20 20 20 20       k,.        
9030: 20 20 20 20 20 20 20 69 73 48 69 64 64 65 6e 29         isHidden)
9040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9050: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69    }.  break;..#i
9060: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9070: 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  G.  case PragTyp
9080: 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20 49 6e  _STATS: {.    In
9090: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 48  dex *pIdx;.    H
90a0: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20 20  ashElem *i;.    
90b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35  pParse->nMem = 5
90c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
90d0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
90e0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
90f0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
9100: 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
9110: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
9120: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9130: 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20 54 61  xt(i)){.      Ta
9140: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
9150: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
9160: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9170: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9180: 22 73 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20  "ssiii",.       
9190: 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20  .           0,. 
91b0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
91c0: 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20 20 20  szTabRow,.      
91d0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
91e0: 6f 67 45 73 74 2c 0a 20 20 20 20 20 20 20 20 20  ogEst,.         
91f0: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
9200: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
9210: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
9220: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
9230: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
9240: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9250: 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73 69 69  iLoad(v, 2, "sii
9260: 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iX",.           
9270: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pIdx->zName,.   
9280: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 73 7a          pIdx->sz
9290: 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  IdxRow,.        
92a0: 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f     pIdx->aiRowLo
92b0: 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20 20  gEst[0],.       
92c0: 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53 74 61      pIdx->hasSta
92d0: 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  t1);.        sql
92e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
92f0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9300: 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 5);.      }. 
9310: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9320: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65  ;.#endif..  case
9330: 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 49   PragTyp_INDEX_I
9340: 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20  NFO: if( zRight 
9350: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9360: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
9370: 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  Tab;.    pIdx = 
9380: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
9390: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
93a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
93b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
93c0: 78 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  xDb = sqlite3Sch
93d0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
93e0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Idx->pSchema);. 
93f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9400: 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20 20    int mx;.      
9410: 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  if( pPragma->iAr
9420: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
9430: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
9440: 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69 6f  fo (newer versio
9450: 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77 73  n with more rows
9460: 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f   and columns) */
9470: 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70 49  .        mx = pI
9480: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
9490: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
94a0: 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65 6c  m = 6;.      }el
94b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 50  se{.        /* P
94c0: 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66 6f  RAGMA index_info
94d0: 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f 6e   (legacy version
94e0: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20  ) */.        mx 
94f0: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
9500: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
9510: 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 20  >nMem = 3;.     
9520: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20   }.      pTab = 
9530: 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
9540: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
9550: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
9560: 73 65 2c 20 69 49 64 78 44 62 29 3b 0a 20 20 20  se, iIdxDb);.   
9570: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
9580: 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61  e->nMem<=pPragma
9590: 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a  ->nPragCName );.
95a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
95b0: 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <mx; i++){.     
95c0: 20 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49     i16 cnum = pI
95d0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
95e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
95f0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9600: 20 31 2c 20 22 69 69 73 58 22 2c 20 69 2c 20 63   1, "iisX", i, c
9610: 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  num,.           
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70    cnum<0 ? 0 : p
9640: 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e  Tab->aCol[cnum].
9650: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
9660: 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  if( pPragma->iAr
9670: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  g ){.          s
9680: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9690: 6f 61 64 28 76 2c 20 34 2c 20 22 69 73 69 58 22  oad(v, 4, "isiX"
96a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ,.            pI
96b0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
96c0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ],.            p
96d0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a  Idx->azColl[i],.
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 70 49              i<pI
96f0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
9700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9720: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9730: 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  w, 1, pParse->nM
9740: 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  em);.      }.   
9750: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9760: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9770: 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20  INDEX_LIST: if( 
9780: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e  zRight ){.    In
9790: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54  dex *pIdx;.    T
97a0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
97b0: 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20  int i;.    pTab 
97c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
97d0: 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  le(db, zRight, z
97e0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
97f0: 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  b ){.      int i
9800: 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53  TabDb = sqlite3S
9810: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
9820: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
9830: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
9840: 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20 73  Mem = 5;.      s
9850: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
9860: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
9870: 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  TabDb);.      fo
9880: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
9890: 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20  dex, i=0; pIdx; 
98a0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
98b0: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
98c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72  const char *azOr
98d0: 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20  igin[] = { "c", 
98e0: 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20  "u", "pk" };.   
98f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9900: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9910: 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20  "isisi",.       
9920: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9930: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
9940: 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69 71            IsUniq
9950: 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20  ueIndex(pIdx),. 
9960: 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67            azOrig
9970: 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65  in[pIdx->idxType
9980: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ],.           pI
9990: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
99a0: 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e!=0);.      }. 
99b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
99c0: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
99d0: 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a  p_DATABASE_LIST:
99e0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
99f0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9a00: 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   3;.    for(i=0;
9a10: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9a20: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
9a30: 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[i].pBt==0 ) 
9a40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9a50: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
9a60: 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29  i].zDbSName!=0 )
9a70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9a80: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9a90: 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20  1, "iss",.      
9aa0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64     i,.         d
9ab0: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
9ac0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  me,.         sql
9ad0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
9ae0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  name(db->aDb[i].
9af0: 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBt));.    }.  }
9b00: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
9b10: 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54  e PragTyp_COLLAT
9b20: 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ION_LIST: {.    
9b30: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48  int i = 0;.    H
9b40: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20  ashElem *p;.    
9b50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
9b60: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
9b70: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9b80: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70  >aCollSeq); p; p
9b90: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9ba0: 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  p)){.      CollS
9bb0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
9bc0: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
9bd0: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
9be0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9bf0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c  Load(v, 1, "is",
9c00: 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   i++, pColl->zNa
9c10: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
9c20: 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20   break;..#ifdef 
9c30: 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43  SQLITE_INTROSPEC
9c40: 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 63  TION_PRAGMAS.  c
9c50: 61 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e 43  ase PragTyp_FUNC
9c60: 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  TION_LIST: {.   
9c70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73 68   int i;.    Hash
9c80: 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75 6e  Elem *j;.    Fun
9c90: 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50 61  cDef *p;.    pPa
9ca0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
9cb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51     for(i=0; i<SQ
9cc0: 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f 53  LITE_FUNC_HASH_S
9cd0: 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  Z; i++){.      f
9ce0: 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c  or(p=sqlite3Buil
9cf0: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69  tinFunctions.a[i
9d00: 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61  ]; p; p=p->u.pHa
9d10: 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  sh ){.        if
9d20: 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  ( p->funcFlags &
9d30: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e 54   SQLITE_FUNC_INT
9d40: 45 52 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65  ERNAL ) continue
9d50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9d60: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9d70: 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e  , 1, "si", p->zN
9d80: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ame, 1);.      }
9d90: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
9da0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9db0: 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 6a 3b  (&db->aFunc); j;
9dc0: 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   j=sqliteHashNex
9dd0: 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 70 20 3d  t(j)){.      p =
9de0: 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74   (FuncDef*)sqlit
9df0: 65 48 61 73 68 44 61 74 61 28 6a 29 3b 0a 20 20  eHashData(j);.  
9e00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9e10: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9e20: 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  si", p->zName, 0
9e30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
9e40: 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  reak;..#ifndef S
9e50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9e60: 41 4c 54 41 42 4c 45 0a 20 20 63 61 73 65 20 50  ALTABLE.  case P
9e70: 72 61 67 54 79 70 5f 4d 4f 44 55 4c 45 5f 4c 49  ragTyp_MODULE_LI
9e80: 53 54 3a 20 7b 0a 20 20 20 20 48 61 73 68 45 6c  ST: {.    HashEl
9e90: 65 6d 20 2a 6a 3b 0a 20 20 20 20 70 50 61 72 73  em *j;.    pPars
9ea0: 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20  e->nMem = 1;.   
9eb0: 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61 73   for(j=sqliteHas
9ec0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
9ed0: 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74  ule); j; j=sqlit
9ee0: 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a 20  eHashNext(j)){. 
9ef0: 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f       Module *pMo
9f00: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
9f10: 69 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b 0a  iteHashData(j);.
9f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9f30: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9f40: 20 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a 4e 61 6d   "s", pMod->zNam
9f50: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
9f60: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
9f70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9f80: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
9f90: 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 52 41  case PragTyp_PRA
9fa0: 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  GMA_LIST: {.    
9fb0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
9fc0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9fd0: 61 50 72 61 67 6d 61 4e 61 6d 65 29 3b 20 69 2b  aPragmaName); i+
9fe0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
9ff0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
a000: 2c 20 31 2c 20 22 73 22 2c 20 61 50 72 61 67 6d  , 1, "s", aPragm
a010: 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aName[i].zName);
a020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
a030: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
a040: 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49  LITE_INTROSPECTI
a050: 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ON_PRAGMAS */..#
a060: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a070: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47  OMIT_SCHEMA_PRAG
a080: 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  MAS */..#ifndef 
a090: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
a0a0: 49 47 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20 50  IGN_KEY.  case P
a0b0: 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b  ragTyp_FOREIGN_K
a0c0: 45 59 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69  EY_LIST: if( zRi
a0d0: 67 68 74 20 29 7b 0a 20 20 20 20 46 4b 65 79 20  ght ){.    FKey 
a0e0: 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20  *pFK;.    Table 
a0f0: 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20  *pTab;.    pTab 
a100: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
a110: 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  le(db, zRight, z
a120: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
a130: 62 20 29 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d  b ){.      pFK =
a140: 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20   pTab->pFKey;.  
a150: 20 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20      if( pFK ){. 
a160: 20 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44         int iTabD
a170: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
a180: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
a190: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
a1a0: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20       int i = 0; 
a1b0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
a1c0: 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20  >nMem = 8;.     
a1d0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
a1e0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
a1f0: 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20  e, iTabDb);.    
a200: 20 20 20 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a      while(pFK){.
a210: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
a220: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
a230: 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b  =0; j<pFK->nCol;
a240: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
a250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
a260: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
a270: 69 73 73 73 73 73 73 22 2c 0a 20 20 20 20 20 20  issssss",.      
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a               i,.
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20     j,.          
a2b0: 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54           pFK->zT
a2c0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
a2d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
a2e0: 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46  [pFK->aCol[j].iF
a2f0: 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20  rom].zName,.    
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a310: 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  FK->aCol[j].zCol
a320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a330: 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28       actionName(
a340: 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29  pFK->aAction[1])
a350: 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20  ,  /* ON UPDATE 
a360: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
a370: 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65        actionName
a380: 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  (pFK->aAction[0]
a390: 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45  ),  /* ON DELETE
a3a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a3b0: 20 20 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a         "NONE");.
a3c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a3d0: 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20        ++i;.     
a3e0: 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e       pFK = pFK->
a3f0: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20  pNextFrom;.     
a400: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a410: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
a420: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
a430: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
a440: 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a  OREIGN_KEY) */..
a450: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a460: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
a470: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a480: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63 61  MIT_TRIGGER.  ca
a490: 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49  se PragTyp_FOREI
a4a0: 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b 0a  GN_KEY_CHECK: {.
a4b0: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20      FKey *pFK;  
a4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
a4d0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a4e0: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61  traint */.    Ta
a4f0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
a500: 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74 61       /* Child ta
a510: 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45 46  ble contain "REF
a520: 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72 64  ERENCES" keyword
a530: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
a540: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
a550: 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 74  * Parent table t
a560: 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73  hat child points
a570: 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78   to */.    Index
a580: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
a590: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74 68    /* Index in th
a5a0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a  e parent table *
a5b0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46  Loop counter:  F
a5e0: 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65  oreign key numbe
a5f0: 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  r for pTab */.  
a600: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
a610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a620: 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c 64   counter:  Field
a630: 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20   of the foreign 
a640: 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68 45  key */.    HashE
a650: 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
a660: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a670: 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20 69  r:  Next table i
a680: 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  n schema */.    
a690: 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20 20  int x;          
a6a0: 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c 74         /* result
a6b0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
a6c0: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
a6d0: 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65 67          /* 3 reg
a6e0: 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61  isters to hold a
a6f0: 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
a700: 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20 20     int regKey;  
a710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
a720: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65  ister to hold ke
a730: 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20 74  y for checking t
a740: 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74  he FK */.    int
a750: 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20 20   regRow;        
a760: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
a770: 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20 66   to hold a row f
a780: 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  rom pTab */.    
a790: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
a7a0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
a7b0: 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67   a loop checking
a7c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f   foreign keys */
a7d0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b  .    int addrOk;
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
a7f0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
a800: 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20  key is OK */.   
a810: 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20   int *aiCols;   
a820: 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c 64          /* child
a830: 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d   to parent colum
a840: 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20  n mapping */..  
a850: 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 50    regResult = pP
a860: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
a870: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
a880: 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79 20  = 4;.    regKey 
a890: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a8a0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 2b  ;.    regRow = +
a8b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a8c0: 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73     k = sqliteHas
a8d0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
a8e0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  iDb].pSchema->tb
a8f0: 6c 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69 6c  lHash);.    whil
a900: 65 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e  e( k ){.      in
a910: 74 20 69 54 61 62 44 62 3b 0a 20 20 20 20 20 20  t iTabDb;.      
a920: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
a930: 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
a940: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
a950: 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67 68  pParse, 0, zRigh
a960: 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  t, zDb);.       
a970: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   k = 0;.      }e
a980: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
a990: 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
a9a0: 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
a9b0: 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74         k = sqlit
a9c0: 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20 20  eHashNext(k);.  
a9d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a9e0: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62 2d  pTab==0 || pTab-
a9f0: 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e 74  >pFKey==0 ) cont
aa00: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 54 61 62  inue;.      iTab
aa10: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
aa20: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
aa30: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
aa40: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
aa50: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
aa60: 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20  se, iTabDb);.   
aa70: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
aa80: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62  ock(pParse, iTab
aa90: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
aaa0: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
aab0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
aac0: 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61  >nCol+regRow>pPa
aad0: 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72  rse->nMem ) pPar
aae0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d  se->nMem = pTab-
aaf0: 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a  >nCol + regRow;.
ab00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
ab10: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  nTable(pParse, 0
ab20: 2c 20 69 54 61 62 44 62 2c 20 70 54 61 62 2c 20  , iTabDb, pTab, 
ab30: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
ab40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
ab50: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67  oadString(v, reg
ab60: 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e  Result, pTab->zN
ab70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
ab80: 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70  i=1, pFK=pTab->p
ab90: 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20  FKey; pFK; i++, 
aba0: 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72  pFK=pFK->pNextFr
abb0: 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  om){.        pPa
abc0: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69  rent = sqlite3Fi
abd0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d  ndTable(db, pFK-
abe0: 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20  >zTo, zDb);.    
abf0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d      if( pParent=
ac00: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
ac10: 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b         pIdx = 0;
ac20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac30: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
ac40: 2c 20 69 54 61 62 44 62 2c 20 70 50 61 72 65 6e  , iTabDb, pParen
ac50: 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61 72  t->tnum, 0, pPar
ac60: 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ent->zName);.   
ac70: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
ac80: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
ac90: 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
aca0: 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a 20  FK, &pIdx, 0);. 
acb0: 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20         if( x==0 
acc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
acd0: 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
ace0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
acf0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
ad00: 20 69 2c 20 69 54 61 62 44 62 2c 20 70 50 61 72   i, iTabDb, pPar
ad10: 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  ent, OP_OpenRead
ad20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
ad30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
ad40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ad50: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
ad60: 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  , i, pIdx->tnum,
ad70: 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20   iTabDb);.      
ad80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad90: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
ada0: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
adb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
adc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
add0: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
ade0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
adf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ae00: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
ae10: 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b 3d  ->nErr>0 || pFK=
ae20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
ae30: 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pFK ) break;.   
ae40: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
ae50: 54 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d 3e  Tab<i ) pParse->
ae60: 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  nTab = i;.      
ae70: 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
ae80: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ae90: 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56 64  P_Rewind, 0); Vd
aea0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
aeb0: 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46       for(i=1, pF
aec0: 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  K=pTab->pFKey; p
aed0: 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b  FK; i++, pFK=pFK
aee0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
aef0: 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20        pParent = 
af00: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
af10: 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a  (db, pFK->zTo, z
af20: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  Db);.        pId
af30: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  x = 0;.        a
af40: 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 20  iCols = 0;.     
af50: 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29     if( pParent )
af60: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20  {.          x = 
af70: 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49  sqlite3FkLocateI
af80: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50 61  ndex(pParse, pPa
af90: 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78  rent, pFK, &pIdx
afa0: 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20  , &aiCols);.    
afb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3d        assert( x=
afc0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  =0 );.        }.
afd0: 20 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20 3d          addrOk =
afe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
aff0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
b000: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
b010: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61 64  ate code to read
b020: 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76   the child key v
b030: 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69 73  alues into regis
b040: 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ters.        ** 
b050: 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e  regRow..regRow+n
b060: 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  . If any of the 
b070: 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73  child key values
b080: 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73 20   are NULL, this 
b090: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  .        ** row 
b0a0: 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e 20  cannot cause an 
b0b0: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75  FK violation. Ju
b0c0: 6d 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  mp directly to a
b0d0: 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20 20  ddrOk in .      
b0e0: 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20    ** this case. 
b0f0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
b100: 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b  =0; j<pFK->nCol;
b110: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
b120: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43 6f   int iCol = aiCo
b130: 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a  ls ? aiCols[j] :
b140: 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46   pFK->aCol[j].iF
b150: 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  rom;.          s
b160: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
b170: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
b180: 2c 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c 2c  , pTab, 0, iCol,
b190: 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20   regRow+j);.    
b1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
b1c0: 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20  Null, regRow+j, 
b1d0: 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76  addrOk); VdbeCov
b1e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b1f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
b200: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
b210: 20 71 75 65 72 79 20 74 68 65 20 70 61 72 65 6e   query the paren
b220: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d 61  t index for a ma
b230: 74 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20 20  tching parent.  
b240: 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49 66        ** key. If
b250: 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
b260: 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 4f  d, jump to addrO
b270: 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  k. */.        if
b280: 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
b290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2a0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
b2b0: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
b2c0: 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65  pFK->nCol, regKe
b2d0: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
b2e0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
b2f0: 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64 78  inityStr(db,pIdx
b300: 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20  ), pFK->nCol);. 
b310: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b320: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b330: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64   OP_Found, i, ad
b340: 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29  drOk, regKey, 0)
b350: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
b360: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b370: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b380: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
b390: 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73 71      int jmp = sq
b3a0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
b3b0: 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20 20  Addr(v)+2;.     
b3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b3d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b3e0: 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c 20  kRowid, i, jmp, 
b3f0: 72 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76  regRow); VdbeCov
b400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
b420: 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a  oto(v, addrOk);.
b430: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b440: 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29  ( pFK->nCol==1 )
b450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
b460: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
b470: 20 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74 20   code to report 
b480: 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 20  an FK violation 
b490: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a  to the caller. *
b4a0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  /.        if( Ha
b4b0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
b4c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b4d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b4e0: 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52  P_Rowid, 0, regR
b4f0: 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20  esult+1);.      
b500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b520: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
b530: 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29   0, regResult+1)
b540: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b560: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52  ultiLoad(v, regR
b570: 65 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c 20  esult+2, "siX", 
b580: 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a  pFK->zTo, i-1);.
b590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b5a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b5b0: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
b5c0: 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20  sult, 4);.      
b5d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b5e0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
b5f0: 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rOk);.        sq
b600: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b610: 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d  aiCols);.      }
b620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b630: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b640: 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b  ext, 0, addrTop+
b650: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
b660: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
b670: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b680: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
b690: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
b6a0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
b6b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
b6c0: 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66  IGGER) */.#endif
b6d0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
b6e0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
b6f0: 5f 4b 45 59 29 20 2a 2f 0a 0a 20 20 2f 2a 20 52  _KEY) */..  /* R
b700: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b710: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b720: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b730: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b740: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b750: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b760: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b770: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b780: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53  case PragTyp_CAS
b790: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b7a0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b7b0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b7c0: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
b7d0: 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c  unctions(db, sql
b7e0: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b7f0: 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20  Right, 0));.    
b800: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
b810: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49  #ifndef SQLITE_I
b820: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
b830: 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e  RROR_MAX.# defin
b840: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  e SQLITE_INTEGRI
b850: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
b860: 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23  AX 100.#endif..#
b870: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b880: 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
b890: 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d  CK.  /*    PRAGM
b8a0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b8b0: 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41  k.  **    PRAGMA
b8c0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b8d0: 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47  (N).  **    PRAG
b8e0: 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20  MA quick_check. 
b8f0: 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75   **    PRAGMA qu
b900: 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a  ick_check(N).  *
b910: 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  *.  ** Verify th
b920: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
b930: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
b940: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63  *.  ** The "quic
b950: 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75  k_check" is redu
b960: 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  ced version of .
b970: 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63    ** integrity_c
b980: 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f  heck designed to
b990: 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74   detect most dat
b9a0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b9b0: 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .  ** without th
b9c0: 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72  e overhead of cr
b9d0: 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64  oss-checking ind
b9e0: 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65  exes.  Quick_che
b9f0: 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61  ck.  ** is linea
ba00: 72 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20  r time wherease 
ba10: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
ba20: 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a  is O(NlogN)..  *
ba30: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
ba40: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
ba50: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a  : {.    int i, j
ba60: 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a  , addr, mxErr;..
ba70: 20 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20      int isQuick 
ba80: 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  = (sqlite3Tolowe
ba90: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27  r(zLeft[0])=='q'
baa0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
bab0: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  e PRAGMA command
bac0: 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d   was of the form
bad0: 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e   "PRAGMA <db>.in
bae0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a  tegrity_check",.
baf0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20      ** then iDb 
bb00: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
bb10: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
bb20: 61 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ase identified b
bb30: 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49  y <db>..    ** I
bb40: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
bb50: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61   integrity of da
bb60: 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20  tabase iDb only 
bb70: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20  is verified by. 
bb80: 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63     ** the VDBE c
bb90: 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20  reated below..  
bba0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
bbb0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
bbc0: 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79  mmand was simply
bbd0: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
bbe0: 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20  ty_check" (or.  
bbf0: 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69    ** "PRAGMA qui
bc00: 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e  ck_check"), then
bc10: 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30   iDb is set to 0
bc20: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
bc30: 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74  set iDb.    ** t
bc40: 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e  o -1 here, to in
bc50: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
bc60: 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69  VDBE should veri
bc70: 66 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  fy the integrity
bc80: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61  .    ** of all a
bc90: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
bca0: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
bcb0: 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  t( iDb>=0 );.   
bcc0: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
bcd0: 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20  || pId2->z );.  
bce0: 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30    if( pId2->z==0
bcf0: 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20   ) iDb = -1;..  
bd00: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
bd10: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
bd20: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
bd30: 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f  nMem = 6;..    /
bd40: 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
bd50: 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f  m error count */
bd60: 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c  .    mxErr = SQL
bd70: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
bd80: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
bd90: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
bda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
bdb0: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
bdc0: 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  mxErr);.      if
bdd0: 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20  ( mxErr<=0 ){.  
bde0: 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51        mxErr = SQ
bdf0: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
be00: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a  HECK_ERROR_MAX;.
be10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
be20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be30: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
be40: 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20  r, mxErr-1, 1); 
be50: 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20  /* reg[1] holds 
be60: 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a  errors left */..
be70: 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74      /* Do an int
be80: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20  egrity check on 
be90: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
bea0: 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  le */.    for(i=
beb0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
bec0: 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c  +){.      HashEl
bed0: 65 6d 20 2a 78 3b 20 20 20 20 20 2f 2a 20 46 6f  em *x;     /* Fo
bee0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
bef0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63 68  ables in the sch
bf00: 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 48 61 73  ema */.      Has
bf10: 68 20 2a 70 54 62 6c 73 3b 20 20 20 20 20 2f 2a  h *pTbls;     /*
bf20: 20 53 65 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c   Set of all tabl
bf30: 65 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  es in the schema
bf40: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   */.      int *a
bf50: 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 41 72  Root;      /* Ar
bf60: 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  ray of root page
bf70: 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20   numbers of all 
bf80: 62 74 72 65 65 73 20 2a 2f 0a 20 20 20 20 20 20  btrees */.      
bf90: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
bfa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
bfb0: 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d  tries in aRoot[]
bfc0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   */.      int mx
bfd0: 49 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 4d 61  Idx = 0;   /* Ma
bfe0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
bff0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 79 20  indexes for any 
c000: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
c010: 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20  if( OMIT_TEMPDB 
c020: 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  && i==1 ) contin
c030: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44  ue;.      if( iD
c040: 62 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20 29  b>=0 && i!=iDb )
c050: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
c060: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
c070: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
c080: 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , i);..      /* 
c090: 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20  Do an integrity 
c0a0: 63 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54  check of the B-T
c0b0: 72 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ree.      **.   
c0c0: 20 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66     ** Begin by f
c0d0: 69 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20  inding the root 
c0e0: 70 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20  pages numbers.  
c0f0: 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74      ** for all t
c100: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
c110: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
c120: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
c130: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c140: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
c150: 28 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20  (db, i, 0) );.  
c160: 20 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d      pTbls = &db-
c170: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[i].pSchema-
c180: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20  >tblHash;.      
c190: 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c  for(cnt=0, x=sql
c1a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62  iteHashFirst(pTb
c1b0: 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65  ls); x; x=sqlite
c1c0: 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20  HashNext(x)){.  
c1d0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
c1e0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
c1f0: 74 61 28 78 29 3b 20 20 2f 2a 20 43 75 72 72 65  ta(x);  /* Curre
c200: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  nt table */.    
c210: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
c240: 78 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  x on pTab */.   
c250: 20 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 20 20       int nIdx;  
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c280: 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 70   of indexes on p
c290: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  Tab */.        i
c2a0: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
c2b0: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
c2c0: 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70     for(nIdx=0, p
c2d0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
c2e0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
c2f0: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
c300: 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20  ){ cnt++; }.    
c310: 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49      if( nIdx>mxI
c320: 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64  dx ) mxIdx = nId
c330: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
c340: 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33   aRoot = sqlite3
c350: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c360: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63  , sizeof(int)*(c
c370: 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66  nt+1));.      if
c380: 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65  ( aRoot==0 ) bre
c390: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  ak;.      for(cn
c3a0: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
c3b0: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
c3c0: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
c3d0: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
c3e0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
c3f0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
c400: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
c410: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
c420: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
c430: 20 29 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20   ) aRoot[++cnt] 
c440: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
c450: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
c460: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
c470: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
c480: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
c490: 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70  aRoot[++cnt] = p
c4a0: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
c4b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c4c0: 20 20 20 61 52 6f 6f 74 5b 30 5d 20 3d 20 63 6e     aRoot[0] = cn
c4d0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  t;..      /* Mak
c4e0: 65 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  e sure sufficien
c4f0: 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  t number of regi
c500: 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  sters have been 
c510: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
c520: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
c530: 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e  = MAX( pParse->n
c540: 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a  Mem, 8+mxIdx );.
c550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
c560: 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
c570: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  Parse);..      /
c580: 2a 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20  * Do the b-tree 
c590: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73  integrity checks
c5a0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
c5b0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c5c0: 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32  P_IntegrityCk, 2
c5d0: 2c 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a  , cnt, 1, (char*
c5e0: 29 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52  )aRoot,P4_INTARR
c5f0: 41 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  AY);.      sqlit
c600: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c610: 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20  , (u8)i);.      
c620: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c630: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c640: 73 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43  sNull, 2); VdbeC
c650: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c670: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
c680: 38 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20  8, 0, 3, 0,.    
c690: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
c6a0: 6e 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20  ntf(db, "*** in 
c6b0: 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c  database %s ***\
c6c0: 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  n", db->aDb[i].z
c6d0: 44 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  DbSName),.      
c6e0: 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
c6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c700: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
c710: 6e 63 61 74 2c 20 32 2c 20 33 2c 20 33 29 3b 0a  ncat, 2, 3, 3);.
c720: 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43        integrityC
c730: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29  heckResultRow(v)
c740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c750: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c760: 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ddr);..      /* 
c770: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  Make sure all th
c780: 65 20 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f  e indices are co
c790: 6e 73 74 72 75 63 74 65 64 20 63 6f 72 72 65 63  nstructed correc
c7a0: 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
c7b0: 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65      for(x=sqlite
c7c0: 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29  HashFirst(pTbls)
c7d0: 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73  ; x; x=sqliteHas
c7e0: 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20  hNext(x)){.     
c7f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c800: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
c810: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  x);.        Inde
c820: 78 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a 20  x *pIdx, *pPk;. 
c830: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
c840: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c850: 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20    int loopTop;. 
c860: 20 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61         int iData
c870: 43 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20 20  Cur, iIdxCur;.  
c880: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2d        int r1 = -
c890: 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  1;..        if( 
c8a0: 70 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20 63  pTab->tnum<1 ) c
c8b0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69  ontinue;  /* Ski
c8c0: 70 20 56 49 45 57 73 20 6f 72 20 56 49 52 54 55  p VIEWs or VIRTU
c8d0: 41 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20 20  AL TABLEs */.   
c8e0: 20 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52 6f       pPk = HasRo
c8f0: 77 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a 20  wid(pTab) ? 0 : 
c900: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
c910: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
c920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
c930: 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73  nTableAndIndices
c940: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f  (pParse, pTab, O
c950: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20  P_OpenRead, 0,. 
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75    1, 0, &iDataCu
c990: 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20  r, &iIdxCur);.  
c9a0: 20 20 20 20 20 20 2f 2a 20 72 65 67 5b 37 5d 20        /* reg[7] 
c9b0: 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65  counts the numbe
c9c0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
c9d0: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  the table..     
c9e0: 20 20 20 2a 2a 20 72 65 67 5b 38 2b 69 5d 20 63     ** reg[8+i] c
c9f0: 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72  ounts the number
ca00: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
ca10: 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 0a 20  he i-th index . 
ca20: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ca30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca40: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
ca50: 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20 20  r, 0, 7);.      
ca60: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d    for(j=0, pIdx=
ca70: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ca80: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ca90: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
caa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cab0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
cac0: 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b 20  teger, 0, 8+j); 
cad0: 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  /* index entries
cae0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
caf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
cb00: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d  sert( pParse->nM
cb10: 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20 20 20 20  em>=8+j );.     
cb20: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
cb30: 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65  e3NoTempsInRange
cb40: 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a 29 20 29  (pParse,1,7+j) )
cb50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cb60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cb70: 50 5f 52 65 77 69 6e 64 2c 20 69 44 61 74 61 43  P_Rewind, iDataC
cb80: 75 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  ur, 0); VdbeCove
cb90: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
cba0: 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c 69 74   loopTop = sqlit
cbb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cbc0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20 31 29  OP_AddImm, 7, 1)
cbd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ;.        if( !i
cbe0: 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20  sQuick ){.      
cbf0: 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68      /* Sanity ch
cc00: 65 63 6b 20 6f 6e 20 72 65 63 6f 72 64 20 68 65  eck on record he
cc10: 61 64 65 72 20 64 65 63 6f 64 69 6e 67 20 2a 2f  ader decoding */
cc20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cc30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
cc40: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 44 61 74 61  OP_Column, iData
cc50: 43 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d  Cur, pTab->nCol-
cc60: 31 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 3);.         
cc70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
cc80: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54  geP5(v, OPFLAG_T
cc90: 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
cca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
ccb0: 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
ccc0: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
ccd0: 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20   really are NOT 
cce0: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  NULL */.        
ccf0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
cd00: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
cd10: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
cd20: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
cd30: 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20 20   jmp2;.         
cd40: 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50   if( j==pTab->iP
cd50: 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Key ) continue;.
cd60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
cd70: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
cd80: 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ull==0 ) continu
cd90: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e;.          sql
cda0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
cdb0: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
cdc0: 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20  pTab, iDataCur, 
cdd0: 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  j, 3);.         
cde0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
cdf0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54  geP5(v, OPFLAG_T
ce00: 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
ce10: 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69       jmp2 = sqli
ce20: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ce30: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b   OP_NotNull, 3);
ce40: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ce50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72  ;.          zErr
ce60: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ce70: 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75  f(db, "NULL valu
ce80: 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54 61  e in %s.%s", pTa
ce90: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
cec0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
ced0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cee0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
cef0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
cf00: 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
cf10: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  IC);.          i
cf20: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
cf30: 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20  ultRow(v);.     
cf40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32  JumpHere(v, jmp2
cf60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cf70: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 43       /* Verify C
cf80: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
cf90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
cfa0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 26 26 20  pTab->pCheck && 
cfb0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
cfc0: 49 54 45 5f 49 67 6e 6f 72 65 43 68 65 63 6b 73  ITE_IgnoreChecks
cfd0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cfe0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 65    ExprList *pChe
cff0: 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
d000: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 61 62  ListDup(db, pTab
d010: 2d 3e 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20 20  ->pCheck, 0);.  
d020: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
d030: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
d040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d050: 6e 74 20 61 64 64 72 43 6b 46 61 75 6c 74 20 3d  nt addrCkFault =
d060: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d070: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
d080: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
d090: 64 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65  ddrCkOk = sqlite
d0a0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
d0b0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d0c0: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d0e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
d0f0: 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
d100: 3d 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a  = iDataCur + 1;.
d110: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
d120: 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d  k=pCheck->nExpr-
d130: 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20  1; k>0; k--){.  
d140: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d150: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
d160: 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61  Parse, pCheck->a
d170: 5b 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43  [k].pExpr, addrC
d180: 6b 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20  kFault, 0);.    
d190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d1b0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
d1c0: 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78  pCheck->a[0].pEx
d1d0: 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20  pr, addrCkOk, . 
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
d1f0: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
d200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d210: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d220: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b  eLabel(v, addrCk
d230: 46 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  Fault);.        
d240: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
d250: 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  fTab = 0;.      
d260: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c        zErr = sql
d270: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d280: 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  "CHECK constrain
d290: 74 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c  t failed in %s",
d2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d2b0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d2d0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
d2e0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33  OP_String8, 0, 3
d2f0: 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  , 0, zErr, P4_DY
d300: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
d310: 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65      integrityChe
d320: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a  ckResultRow(v);.
d330: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d340: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d350: 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29  bel(v, addrCkOk)
d360: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d380: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
d390: 2c 20 70 43 68 65 63 6b 29 3b 0a 20 20 20 20 20  , pCheck);.     
d3a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d3b0: 20 21 69 73 51 75 69 63 6b 20 29 7b 20 2f 2a 20   !isQuick ){ /* 
d3c0: 4f 6d 69 74 20 74 68 65 20 72 65 6d 61 69 6e 69  Omit the remaini
d3d0: 6e 67 20 74 65 73 74 73 20 66 6f 72 20 71 75 69  ng tests for qui
d3e0: 63 6b 5f 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  ck_check */.    
d3f0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74        /* Validat
d400: 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
d410: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
d420: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  row */.         
d430: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
d440: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d450: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d460: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
d470: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c         int jmp2,
d480: 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70   jmp3, jmp4, jmp
d490: 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  5;.            i
d4a0: 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69  nt ckUniq = sqli
d4b0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d4c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d4d0: 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70        if( pPk==p
d4e0: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 31 20 3d              r1 =
d500: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
d510: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
d520: 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c   pIdx, iDataCur,
d530: 20 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20   0, 0, &jmp3,.  
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 72         pPrior, r
d570: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
d580: 70 50 72 69 6f 72 20 3d 20 70 49 64 78 3b 0a 20  pPrior = pIdx;. 
d590: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d5a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d5b0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20  OP_AddImm, 8+j, 
d5c0: 31 29 3b 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20  1);/* increment 
d5d0: 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20  entry count */. 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
d5f0: 72 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64  rify that an ind
d600: 65 78 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ex entry exists 
d610: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
d620: 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20  table row */.   
d630: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
d640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d650: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
d660: 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55  , iIdxCur+j, ckU
d670: 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  niq, r1,.       
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d6b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d6d0: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d6e0: 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22  ing(v, 3, "row "
d6f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d710: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37  (v, OP_Concat, 7
d720: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d730: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d740: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c  LoadString(v, 4,
d750: 20 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20   " missing from 
d760: 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20  index ");.      
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d780: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d790: 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a  ncat, 4, 3, 3);.
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 35              jmp5
d7b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f   = sqlite3VdbeLo
d7c0: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70  adString(v, 4, p
d7d0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
d7e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d7f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d800: 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33  _Concat, 4, 3, 3
d810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
d820: 6d 70 34 20 3d 20 69 6e 74 65 67 72 69 74 79 43  mp4 = integrityC
d830: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29  heckResultRow(v)
d840: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d850: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d860: 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20  e(v, jmp2);.    
d870: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55          /* For U
d880: 4e 49 51 55 45 20 69 6e 64 65 78 65 73 2c 20 76  NIQUE indexes, v
d890: 65 72 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20  erify that only 
d8a0: 6f 6e 65 20 65 6e 74 72 79 20 65 78 69 73 74 73  one entry exists
d8b0: 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
d8c0: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
d8d0: 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72 79   key.  The entry
d8e0: 20 69 73 20 75 6e 69 71 75 65 20 69 66 20 28 31   is unique if (1
d8f0: 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  ) any column is 
d900: 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20  NULL.           
d910: 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e   ** or (2) the n
d920: 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20  ext entry has a 
d930: 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f  different key */
d940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
d950: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
d960: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
d970: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b        int uniqOk
d980: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d990: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
d9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d9b0: 6e 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20  nt jmp6;.       
d9c0: 20 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20         int kk;. 
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
d9e0: 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e  (kk=0; kk<pIdx->
d9f0: 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a  nKeyCol; kk++){.
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
da20: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20  >aiColumn[kk];. 
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
da40: 73 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f  ssert( iCol!=XN_
da50: 52 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54  ROWID && iCol<pT
da60: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
da70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
da80: 69 43 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d  iCol>=0 && pTab-
da90: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
daa0: 75 6c 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ull ) continue;.
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dad0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
dae0: 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a  r1+kk, uniqOk);.
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
db10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
db20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
db30: 6d 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp6 = sqlite3Vdb
db40: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65  eAddOp1(v, OP_Ne
db50: 78 74 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b 20  xt, iIdxCur+j); 
db60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
db70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
db80: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
db90: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
dba0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dbb0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
dbc0: 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp6);.         
dbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dbe0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
dbf0: 49 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a  IdxGT, iIdxCur+j
dc00: 2c 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20  , uniqOk, r1,.  
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
dc40: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dc50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
dc60: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
dc70: 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e 6f 6e  tring(v, 3, "non
dc80: 2d 75 6e 69 71 75 65 20 65 6e 74 72 79 20 69 6e  -unique entry in
dc90: 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20   index ");.     
dca0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dcb0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35  VdbeGoto(v, jmp5
dcc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
dcd0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
dce0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71  lveLabel(v, uniq
dcf0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Ok);.           
dd00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
dd10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
dd20: 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20 20  re(v, jmp4);.   
dd30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dd40: 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61  ResolvePartIdxLa
dd50: 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33  bel(pParse, jmp3
dd60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
dd70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dd80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dd90: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
dda0: 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70  DataCur, loopTop
ddb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ddc0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
ddd0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
dde0: 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23  v, loopTop-1);.#
ddf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
de00: 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
de10: 20 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69        if( !isQui
de20: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
de30: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
de40: 74 72 69 6e 67 28 76 2c 20 32 2c 20 22 77 72 6f  tring(v, 2, "wro
de50: 6e 67 20 23 20 6f 66 20 65 6e 74 72 69 65 73 20  ng # of entries 
de60: 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20  in index ");.   
de70: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
de80: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
de90: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
dea0: 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b  dx->pNext, j++){
deb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
dec0: 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e   pPk==pIdx ) con
ded0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
dee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
def0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
df00: 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b  , iIdxCur+j, 3);
df10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
df20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
df30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
df40: 38 2b 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62 65  8+j, 0, 3); Vdbe
df50: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
df60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df70: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
df80: 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b  SQLITE_NOTNULL);
df90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dfa0: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
dfb0: 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a  ng(v, 4, pIdx->z
dfc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
dfd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dfe0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
dff0: 74 2c 20 34 2c 20 32 2c 20 33 29 3b 0a 20 20 20  t, 4, 2, 3);.   
e000: 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69           integri
e010: 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77  tyCheckResultRow
e020: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
e030: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e040: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
e050: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e060: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
e070: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
e080: 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7d  COUNT */.      }
e090: 20 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20 20   .    }.    {.  
e0a0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e0b0: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
e0c0: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
e0d0: 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
e0e0: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
e0f0: 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  endCode[] = {.  
e100: 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d        { OP_AddIm
e110: 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20  m,      1, 0,   
e120: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30       0},    /* 0
e130: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
e140: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31 2c  _IfNotZero,   1,
e150: 20 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   4,        0},  
e160: 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20    /* 1 */.      
e170: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
e180: 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
e190: 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a   0},    /* 2 */.
e1a0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73          { OP_Res
e1b0: 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c 20  ultRow,   3, 1, 
e1c0: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e1d0: 20 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   3 */.        { 
e1e0: 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20  OP_Halt,        
e1f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
e200: 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20      /* 4 */.    
e210: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38      { OP_String8
e220: 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20  ,     0, 3,     
e230: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 35 20 2a     0},    /* 5 *
e240: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 47  /.        { OP_G
e250: 6f 74 6f 2c 20 20 20 20 20 20 20 20 30 2c 20 33  oto,        0, 3
e260: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
e270: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7d 3b  /* 6 */.      };
e280: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
e290: 4f 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d  Op;..      aOp =
e2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e2b0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
e2c0: 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64  ze(endCode), end
e2d0: 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20  Code, iLn);.    
e2e0: 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20    if( aOp ){.   
e2f0: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d       aOp[0].p2 =
e300: 20 31 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20   1-mxErr;.      
e310: 20 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20    aOp[2].p4type 
e320: 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20  = P4_STATIC;.   
e330: 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a       aOp[2].p4.z
e340: 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 20   = "ok";.       
e350: 20 61 4f 70 5b 35 5d 2e 70 34 74 79 70 65 20 3d   aOp[5].p4type =
e360: 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20   P4_STATIC;.    
e370: 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34 2e 7a 20      aOp[5].p4.z 
e380: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
e390: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 43 4f  ErrStr(SQLITE_CO
e3a0: 52 52 55 50 54 29 3b 0a 20 20 20 20 20 20 7d 0a  RRUPT);.      }.
e3b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e3c0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 30 2c 20  eChangeP3(v, 0, 
e3d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e3e0: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
e3f0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
e400: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e410: 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
e420: 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
e430: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
e440: 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TF16.  /*.  **  
e450: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
e460: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65  .  **   PRAGMA e
e470: 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d 38  ncoding = "utf-8
e480: 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74 66 2d  "|"utf-16"|"utf-
e490: 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62 65 22  16le"|"utf-16be"
e4a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69 74  .  **.  ** In it
e4b0: 73 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68  s first form, th
e4c0: 69 73 20 70 72 61 67 6d 61 20 72 65 74 75 72 6e  is pragma return
e4d0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
e4e0: 66 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20  f the main.  ** 
e4f0: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
e500: 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
e510: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69 74   initialized, it
e520: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
e530: 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  now..  **.  ** T
e540: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f  he second form o
e550: 66 20 74 68 69 73 20 70 72 61 67 6d 61 20 69 73  f this pragma is
e560: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
e570: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
e580: 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  le.  ** has not 
e590: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69  already been ini
e5a0: 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68 69  tialized. In thi
e5b0: 73 20 63 61 73 65 20 69 74 20 73 65 74 73 20 74  s case it sets t
e5c0: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20  he default.  ** 
e5d0: 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20 77 69  encoding that wi
e5e0: 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ll be used for t
e5f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e600: 20 66 69 6c 65 20 69 66 20 61 20 6e 65 77 20 66   file if a new f
e610: 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72 65 61  ile.  ** is crea
e620: 74 65 64 2e 20 49 66 20 61 6e 20 65 78 69 73 74  ted. If an exist
e630: 69 6e 67 20 6d 61 69 6e 20 64 61 74 61 62 61 73  ing main databas
e640: 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
e650: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
e660: 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63  default text enc
e670: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 65 78  oding for the ex
e680: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
e690: 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a 20  is used..  ** . 
e6a0: 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73   ** In all cases
e6b0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 73 20 63   new databases c
e6c0: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
e6d0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20   ATTACH command 
e6e0: 61 72 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  are.  ** created
e6f0: 20 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65   to use the same
e700: 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e   default text en
e710: 63 6f 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61  coding as the ma
e720: 69 6e 20 64 61 74 61 62 61 73 65 2e 20 49 66 0a  in database. If.
e730: 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61    ** the main da
e740: 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62  tabase has not b
e750: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
e760: 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 64 20 77  and/or created w
e770: 68 65 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a 20  hen ATTACH.  ** 
e780: 69 73 20 65 78 65 63 75 74 65 64 2c 20 74 68 69  is executed, thi
e790: 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
e7a0: 20 74 68 65 20 41 54 54 41 43 48 20 6f 70 65 72   the ATTACH oper
e7b0: 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ation..  **.  **
e7c0: 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66   In the second f
e7d0: 6f 72 6d 20 74 68 69 73 20 70 72 61 67 6d 61 20  orm this pragma 
e7e0: 73 65 74 73 20 74 68 65 20 74 65 78 74 20 65 6e  sets the text en
e7f0: 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 75 73 65  coding to be use
e800: 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64 61  d in.  ** new da
e810: 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
e820: 61 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  ated using this 
e830: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
e840: 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a   It is only.  **
e850: 20 75 73 65 66 75 6c 20 69 66 20 69 6e 76 6f 6b   useful if invok
e860: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
e870: 66 74 65 72 20 74 68 65 20 6d 61 69 6e 20 64 61  fter the main da
e880: 74 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20 20  tabase i.  */.  
e890: 63 61 73 65 20 50 72 61 67 54 79 70 5f 45 4e 43  case PragTyp_ENC
e8a0: 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74 61  ODING: {.    sta
e8b0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
e8c0: 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20 20   EncName {.     
e8d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
e8e0: 20 20 20 20 75 38 20 65 6e 63 3b 0a 20 20 20 20      u8 enc;.    
e8f0: 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b  } encnames[] = {
e900: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c  .      { "UTF8",
e910: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
e920: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
e930: 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20 20 53   { "UTF-8",    S
e940: 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20  QLITE_UTF8      
e950: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
e960: 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a   element [1] */.
e970: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c        { "UTF-16l
e980: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
e990: 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75  LE     },  /* Mu
e9a0: 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 32  st be element [2
e9b0: 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  ] */.      { "UT
e9c0: 46 2d 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f  F-16be", SQLITE_
e9d0: 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 20 20  UTF16BE     },  
e9e0: 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65  /* Must be eleme
e9f0: 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20 20  nt [3] */.      
ea00: 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51  { "UTF16le",  SQ
ea10: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20  LITE_UTF16LE    
ea20: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
ea30: 31 36 62 65 22 2c 20 20 53 51 4c 49 54 45 5f 55  16be",  SQLITE_U
ea40: 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20  TF16BE     },.  
ea50: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22 2c 20      { "UTF-16", 
ea60: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
ea70: 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54       }, /* SQLIT
ea80: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f  E_UTF16NATIVE */
ea90: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 22  .      { "UTF16"
eaa0: 2c 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20  ,    0          
eab0: 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51          }, /* SQ
eac0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
ead0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20 30   */.      { 0, 0
eae0: 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f   }.    };.    co
eaf0: 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61  nst struct EncNa
eb00: 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69 66  me *pEnc;.    if
eb10: 28 20 21 7a 52 69 67 68 74 20 29 7b 20 20 20 20  ( !zRight ){    
eb20: 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  /* "PRAGMA encod
eb30: 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ing" */.      if
eb40: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
eb50: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
eb60: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
eb70: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63       assert( enc
eb80: 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46  names[SQLITE_UTF
eb90: 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  8].enc==SQLITE_U
eba0: 54 46 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TF8 );.      ass
ebb0: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
ebc0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65 6e  LITE_UTF16LE].en
ebd0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
ebe0: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
ebf0: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
ec00: 54 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63 3d  TE_UTF16BE].enc=
ec10: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
ec20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
ec30: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 65 6e 63  ingleText(v, enc
ec40: 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65  names[ENC(pParse
ec50: 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->db)].zName);. 
ec60: 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20     }else{       
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f   /* "PRAGMA enco
ec90: 64 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20  ding = XXX" */. 
eca0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61       /* Only cha
ecb0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
ecc0: 20 73 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74   sqlite.enc if t
ecd0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
ece0: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  le is not.      
ecf0: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  ** initialized. 
ed00: 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
ed10: 62 61 73 65 20 65 78 69 73 74 73 2c 20 74 68 65  base exists, the
ed20: 20 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20   new sqlite.enc 
ed30: 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77  value.      ** w
ed40: 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
ed50: 65 6e 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  en when the sche
ed60: 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65  ma is next loade
ed70: 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  d. If it does no
ed80: 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  t.      ** alrea
ed90: 64 79 20 65 78 69 73 74 73 2c 20 69 74 20 77 69  dy exists, it wi
eda0: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
edb0: 20 75 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63   use the new enc
edc0: 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20  oding value..   
edd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
ede0: 0a 20 20 20 20 20 20 20 20 21 28 44 62 48 61 73  .        !(DbHas
edf0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20  Property(db, 0, 
ee00: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
ee10: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62  ) || .        Db
ee20: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
ee30: 30 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20  0, DB_Empty) .  
ee40: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66      ){.        f
ee50: 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65  or(pEnc=&encname
ee60: 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d  s[0]; pEnc->zNam
ee70: 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20  e; pEnc++){.    
ee80: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
ee90: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
eea0: 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29  ht, pEnc->zName)
eeb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
eec0: 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d  SCHEMA_ENC(db) =
eed0: 20 45 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20   ENC(db) =.     
eee0: 20 20 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d             pEnc-
eef0: 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63  >enc ? pEnc->enc
ef00: 20 3a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   : SQLITE_UTF16N
ef10: 41 54 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20  ATIVE;.         
ef20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ef30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ef40: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 45 6e          if( !pEn
ef50: 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  c->zName ){.    
ef60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ef70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
ef80: 6e 73 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64  nsupported encod
ef90: 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74  ing: %s", zRight
efa0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
efb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
efc0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
efd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
efe0: 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
eff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45  SQLITE_OMIT_SCHE
f000: 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d  MA_VERSION_PRAGM
f010: 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  AS.  /*.  **   P
f020: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
f030: 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20  chema_version.  
f040: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
f050: 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73  ema.]schema_vers
f060: 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  ion = <integer>.
f070: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
f080: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72  MA [schema.]user
f090: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20  _version.  **   
f0a0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f0b0: 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c  user_version = <
f0c0: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
f0d0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
f0e0: 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f  ema.]freelist_co
f0f0: 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  unt.  **.  **   
f100: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f110: 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  data_version.  *
f120: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f130: 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61  [schema.]applica
f140: 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50  tion_id.  **   P
f150: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
f160: 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20  pplication_id = 
f170: 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20  <integer>.  **. 
f180: 20 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73   ** The pragma's
f190: 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20   schema_version 
f1a0: 61 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e  and user_version
f1b0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74   are used to set
f1c0: 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65   or get.  ** the
f1d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63   value of the sc
f1e0: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64  hema-version and
f1f0: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72   user-version, r
f200: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74  espectively. Bot
f210: 68 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  h.  ** the schem
f220: 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68  a-version and th
f230: 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61  e user-version a
f240: 72 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64  re 32-bit signed
f250: 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73   integers.  ** s
f260: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
f270: 61 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20  abase header..  
f280: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65  **.  ** The sche
f290: 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75  ma-cookie is usu
f2a0: 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75  ally only manipu
f2b0: 6c 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79  lated internally
f2c0: 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20   by SQLite. It. 
f2d0: 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74   ** is increment
f2e0: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
f2f0: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
f300: 73 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64  se schema is mod
f310: 69 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63  ified (by.  ** c
f320: 72 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70  reating or dropp
f330: 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69  ing a table or i
f340: 6e 64 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d  ndex). The schem
f350: 61 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65  a version is use
f360: 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65  d by.  ** SQLite
f370: 20 65 61 63 68 20 74 69 6d 65 20 61 20 71 75 65   each time a que
f380: 72 79 20 69 73 20 65 78 65 63 75 74 65 64 20 74  ry is executed t
f390: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
f3a0: 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
f3b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68  .  ** of the sch
f3c0: 65 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f  ema used when co
f3d0: 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20  mpiling the SQL 
f3e0: 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 74 68  query matches th
f3f0: 65 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a  e schema of.  **
f400: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 67   the database ag
f410: 61 69 6e 73 74 20 77 68 69 63 68 20 74 68 65 20  ainst which the 
f420: 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69  compiled query i
f430: 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  s actually execu
f440: 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72  ted..  ** Subver
f450: 74 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e  ting this mechan
f460: 69 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52  ism by using "PR
f470: 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73  AGMA schema_vers
f480: 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20  ion" to modify. 
f490: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76   ** the schema-v
f4a0: 65 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74  ersion is potent
f4b0: 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20  ially dangerous 
f4c0: 61 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  and may lead to 
f4d0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61  program.  ** cra
f4e0: 73 68 65 73 20 6f 72 20 64 61 74 61 62 61 73 65  shes or database
f4f0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65   corruption. Use
f500: 20 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20   with caution!. 
f510: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65   **.  ** The use
f520: 72 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74  r-version is not
f530: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
f540: 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d   by SQLite. It m
f550: 61 79 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  ay be used by.  
f560: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ** applications 
f570: 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e  for any purpose.
f580: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
f590: 67 54 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55  gTyp_HEADER_VALU
f5a0: 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  E: {.    int iCo
f5b0: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
f5c0: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
f5d0: 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f  cookie to read o
f5e0: 72 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 69  r write */.    i
f5f0: 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d 61  Cookie = pPragma
f600: 2d 3e 69 41 72 67 20 26 20 50 52 41 47 4d 41 5f  ->iArg & PRAGMA_
f610: 48 45 41 44 45 52 5f 56 41 4c 55 45 5f 4d 41 53  HEADER_VALUE_MAS
f620: 4b 3b 20 20 20 20 20 0a 20 20 20 20 73 71 6c 69  K;     .    sqli
f630: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
f640: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66  (v, iDb);.    if
f650: 28 20 7a 52 69 67 68 74 20 26 26 20 28 70 50 72  ( zRight && (pPr
f660: 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 50 52 41  agma->iArg & PRA
f670: 47 4d 41 5f 48 45 41 44 45 52 5f 56 41 4c 55 45  GMA_HEADER_VALUE
f680: 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _READONLY)==0 ){
f690: 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
f6a0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  the specified co
f6b0: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
f6c0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f6d0: 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43   VdbeOpList setC
f6e0: 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  ookie[] = {.    
f6f0: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
f700: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20  tion,    0,  1, 
f710: 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a   0},    /* 0 */.
f720: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74          { OP_Set
f730: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20  Cookie,      0, 
f740: 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31   0,  0},    /* 1
f750: 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   */.      };.   
f760: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
f770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f780: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
f790: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
f7a0: 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29  Size(setCookie))
f7b0: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
f7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
f7d0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
f7e0: 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43  setCookie), setC
f7f0: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
f800: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
f810: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
f820: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
f830: 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69     aOp[0].p1 = i
f840: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
f850: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f860: 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f   aOp[1].p2 = iCo
f870: 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b  okie;.      aOp[
f880: 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41  1].p3 = sqlite3A
f890: 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
f8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
f8b0: 20 52 65 61 64 20 74 68 65 20 73 70 65 63 69 66   Read the specif
f8c0: 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ied cookie value
f8d0: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
f8e0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
f8f0: 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d  t readCookie[] =
f900: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
f910: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
f920: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
f930: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
f940: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
f950: 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d        0,  1,  0}
f960: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
f970: 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74       { OP_Result
f980: 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31  Row,       1,  1
f990: 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20  ,  0}.      };. 
f9a0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
f9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f9c0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
f9d0: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
f9e0: 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69  aySize(readCooki
f9f0: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
fa00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa10: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
fa20: 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72  ze(readCookie),r
fa30: 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20  eadCookie,0);.  
fa40: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
fa50: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
fa60: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
fa70: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
fa80: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
fa90: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
faa0: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20      aOp[1].p3 = 
fab0: 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73  iCookie;.      s
fac0: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
fad0: 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  le(v);.    }.  }
fae0: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
faf0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fb00: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50  SCHEMA_VERSION_P
fb10: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
fb20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
fb30: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
fb40: 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  GS.  /*.  **   P
fb50: 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70  RAGMA compile_op
fb60: 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tions.  **.  ** 
fb70: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73  Return the names
fb80: 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d   of all compile-
fb90: 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65  time options use
fba0: 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
fbb0: 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e  .  ** one option
fbc0: 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20   per row..  */. 
fbd0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f   case PragTyp_CO
fbe0: 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b  MPILE_OPTIONS: {
fbf0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
fc00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fc10: 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65  zOpt;.    pParse
fc20: 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20  ->nMem = 1;.    
fc30: 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73  while( (zOpt = s
fc40: 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
fc50: 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d  tion_get(i++))!=
fc60: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
fc70: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
fc80: 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20  (v, 1, zOpt);.  
fc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fca0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
fcb0: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
fcc0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
fcd0: 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a  dbeReusable(v);.
fce0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
fcf0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fd00: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
fd10: 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64  _DIAGS */..#ifnd
fd20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
fd30: 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  AL.  /*.  **   P
fd40: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77  RAGMA [schema.]w
fd50: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20  al_checkpoint = 
fd60: 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73  passive|full|res
fd70: 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20  tart|truncate.  
fd80: 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69  **.  ** Checkpoi
fd90: 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  nt the database.
fda0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
fdb0: 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f  gTyp_WAL_CHECKPO
fdc0: 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  INT: {.    int i
fdd0: 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44  Bt = (pId2->z?iD
fde0: 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b:SQLITE_MAX_ATT
fdf0: 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20  ACHED);.    int 
fe00: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
fe10: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
fe20: 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  E;.    if( zRigh
fe30: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
fe40: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
fe50: 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30  ight, "full")==0
fe60: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
fe70: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
fe80: 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20  POINT_FULL;.    
fe90: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
fea0: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
feb0: 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30  t, "restart")==0
fec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
fed0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
fee0: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20  POINT_RESTART;. 
fef0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
ff00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
ff10: 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22  ight, "truncate"
ff20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ff30: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
ff40: 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
ff50: 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
ff60: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  }.    pParse->nM
ff70: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69  em = 3;.    sqli
ff80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ff90: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
ffa0: 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a  iBt, eMode, 1);.
ffb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ffc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
ffd0: 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20  ltRow, 1, 3);.  
ffe0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a  }.  break;..  /*
fff0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77  .  **   PRAGMA w
10000 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
10010 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  t.  **   PRAGMA 
10020 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
10030 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  nt = N.  **.  **
10040 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74   Configure a dat
10050 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10060 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
10070 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64  y checkpoint a d
10080 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74  atabase.  ** aft
10090 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  er accumulating 
100a0 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  N frames in the 
100b0 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f  log. Or query fo
100c0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  r the current va
100d0 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20  lue.  ** of N.. 
100e0 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
100f0 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  yp_WAL_AUTOCHECK
10100 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28  POINT: {.    if(
10110 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
10120 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
10130 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
10140 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
10150 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ht));.    }.    
10160 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
10170 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78  v, .       db->x
10180 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c  WalCallback==sql
10190 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
101a0 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  ok ? .          
101b0 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
101c0 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20  NT(db->pWalArg) 
101d0 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  : 0);.  }.  brea
101e0 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a  k;.#endif..  /*.
101f0 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72    **  PRAGMA shr
10200 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a  ink_memory.  **.
10210 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
10220 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d  ION-OF: R-23445-
10230 34 36 31 30 39 20 54 68 69 73 20 70 72 61 67 6d  46109 This pragm
10240 61 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  a causes the dat
10250 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65  abase.  ** conne
10260 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69  ction on which i
10270 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  t is invoked to 
10280 66 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20  free up as much 
10290 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a  memory as it.  *
102a0 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e  * can, by callin
102b0 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  g sqlite3_db_rel
102c0 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20  ease_memory().. 
102d0 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
102e0 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59  yp_SHRINK_MEMORY
102f0 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
10300 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
10310 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  y(db);.    break
10320 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
10330 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a    PRAGMA optimiz
10340 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f  e.  **  PRAGMA o
10350 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20  ptimize(MASK).  
10360 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d  **  PRAGMA schem
10370 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20  a.optimize.  ** 
10380 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f   PRAGMA schema.o
10390 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20  ptimize(MASK).  
103a0 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74 20  **.  ** Attempt 
103b0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20  to optimize the 
103c0 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20 73  database.  All s
103d0 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69 6d  chemas are optim
103e0 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72 73  ized in the firs
103f0 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73  t.  ** two forms
10400 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73  , and only the s
10410 70 65 63 69 66 69 65 64 20 73 63 68 65 6d 61 20  pecified schema 
10420 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20  is optimized in 
10430 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a  the latter two..
10440 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65    **.  ** The de
10450 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a  tails of optimiz
10460 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ations performed
10470 20 62 79 20 74 68 69 73 20 70 72 61 67 6d 61 20   by this pragma 
10480 61 72 65 20 65 78 70 65 63 74 65 64 0a 20 20 2a  are expected.  *
10490 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64 20  * to change and 
104a0 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69 6d  improve over tim
104b0 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73  e.  Applications
104c0 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70 61   should anticipa
104d0 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69  te that.  ** thi
104e0 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70 65  s pragma will pe
104f0 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69  rform new optimi
10500 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75 72  zations in futur
10510 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a  e releases..  **
10520 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e  .  ** The option
10530 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  al argument is a
10540 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
10550 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65 72  mizations to per
10560 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
10570 20 20 20 30 78 30 30 30 31 20 20 20 20 44 65 62     0x0001    Deb
10580 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f  ugging mode.  Do
10590 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70 65   not actually pe
105a0 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69  rform any optimi
105b0 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20  zations.  **    
105c0 20 20 20 20 20 20 20 20 20 20 62 75 74 20 69 6e            but in
105d0 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e 65  stead return one
105e0 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 6f   line of text fo
105f0 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61 74  r each optimizat
10600 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ion.  **        
10610 20 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c 64        that would
10620 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e   have been done.
10630 20 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c 74    Off by default
10640 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30  ..  **.  **    0
10650 78 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e 41  x0002    Run ANA
10660 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20 74  LYZE on tables t
10670 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66 69  hat might benefi
10680 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75 6c  t.  On by defaul
10690 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t..  **         
106a0 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20 66       See below f
106b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
106c0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  formation..  **.
106d0 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20 20    **    0x0004  
106e0 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65    (Not yet imple
106f0 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20 75  mented) Record u
10700 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72 6d  sage and perform
10710 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20 20  ance .  **      
10720 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74          informat
10730 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ion from the cur
10740 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e 20  rent session in 
10750 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  the.  **        
10760 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
10770 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 77  ile so that it w
10780 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ill be available
10790 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20   to "optimize". 
107a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
107b0 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79 20   pragmas run by 
107c0 66 75 74 75 72 65 20 64 61 74 61 62 61 73 65 20  future database 
107d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
107e0 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 38  *.  **    0x0008
107f0 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70      (Not yet imp
10800 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74 65  lemented) Create
10810 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d 69   indexes that mi
10820 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20 20  ght have.  **   
10830 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20             been 
10840 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65 6e  helpful to recen
10850 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20  t queries.  **. 
10860 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
10870 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77 61  MASK is and alwa
10880 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66 66  ys shall be 0xff
10890 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61 6e  fe.  0xfffe mean
108a0 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20  s perform all.  
108b0 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69  ** of the optimi
108c0 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61  zations listed a
108d0 62 6f 76 65 20 65 78 63 65 70 74 20 44 65 62 75  bove except Debu
108e0 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e  g Mode, includin
108f0 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d  g new.  ** optim
10900 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61  izations that ha
10910 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
10920 69 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65  invented.  If ne
10930 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  w optimizations 
10940 61 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64  are.  ** ever ad
10950 64 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ded that should 
10960 62 65 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c  be off by defaul
10970 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d  t, those off-by-
10980 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70  default .  ** op
10990 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c  timizations will
109a0 20 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f   have bitmasks o
109b0 66 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72  f 0x10000 or lar
109c0 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ger..  **.  ** D
109d0 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20  ETERMINATION OF 
109e0 57 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c  WHEN TO RUN ANAL
109f0 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  YZE.  **.  ** In
10a00 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
10a10 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74  lementation, a t
10a20 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64  able is analyzed
10a30 20 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20   if only if all 
10a40 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  of.  ** the foll
10a50 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
10a60 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41    **.  ** (1) MA
10a70 53 4b 20 62 69 74 20 30 78 30 32 20 69 73 20 73  SK bit 0x02 is s
10a80 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32  et..  **.  ** (2
10a90 29 20 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e  ) The query plan
10aa0 6e 65 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f  ner used sqlite_
10ab0 73 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74  stat1-style stat
10ac0 69 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f  istics for one o
10ad0 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20  r.  **     more 
10ae0 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74  indexes of the t
10af0 61 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69  able at some poi
10b00 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  nt during the li
10b10 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20  fetime of.  **  
10b20 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63     the current c
10b30 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  onnection..  **.
10b40 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20    ** (3) One or 
10b50 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20  more indexes of 
10b60 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 63 75  the table are cu
10b70 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a  rrently unanalyz
10b80 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74  ed OR.  **     t
10b90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
10ba0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68  s in the table h
10bb0 61 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  as increased by 
10bc0 32 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65  25 times or more
10bd0 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20  .  **     since 
10be0 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e  the last time AN
10bf0 41 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20  ALYZE was run.. 
10c00 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c   **.  ** The rul
10c10 65 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c  es for when tabl
10c20 65 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20  es are analyzed 
10c30 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68  are likely to ch
10c40 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74  ange in.  ** fut
10c50 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20  ure releases..  
10c60 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
10c70 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20  p_OPTIMIZE: {.  
10c80 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20    int iDbLast;  
10c90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10ca0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69   termination poi
10cb0 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d  nt for the schem
10cc0 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  a loop */.    in
10cd0 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20  t iTabCur;      
10ce0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
10cf0 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65  or a table whose
10d00 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63   size needs chec
10d10 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68  king */.    Hash
10d20 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
10d30 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20     /* Loop over 
10d40 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65  tables of a sche
10d50 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61  ma */.    Schema
10d60 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20   *pSchema;      
10d70 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
10d80 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61  schema */.    Ta
10d90 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
10da0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
10db0 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  in the schema */
10dc0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
10dd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
10de0 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  n index of the t
10df0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45  able */.    LogE
10e00 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20  st szThreshold; 
10e10 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73     /* Size thres
10e20 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68  hold above which
10e30 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e   reanalysis is n
10e40 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72  eedd */.    char
10e50 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20   *zSubSql;      
10e60 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
10e70 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53  ent for the OP_S
10e80 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f  qlExec opcode */
10e90 0a 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b  .    u32 opMask;
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10eb0 61 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ask of operation
10ec0 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  s to perform */.
10ed0 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
10ee0 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  ){.      opMask 
10ef0 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 41 74  = (u32)sqlite3At
10f00 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
10f10 20 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20    if( (opMask & 
10f20 30 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b  0x02)==0 ) break
10f30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10f40 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66     opMask = 0xff
10f50 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54  fe;.    }.    iT
10f60 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  abCur = pParse->
10f70 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28  nTab++;.    for(
10f80 69 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44  iDbLast = zDb?iD
10f90 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b:db->nDb-1; iDb
10fa0 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b  <=iDbLast; iDb++
10fb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
10fc0 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
10fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
10fe0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
10ff0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
11000 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e    pSchema = db->
11010 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
11020 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71  ;.      for(k=sq
11030 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
11040 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
11050 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73  ; k; k=sqliteHas
11060 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
11070 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
11080 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
11090 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  (k);..        /*
110a0 20 49 66 20 74 61 62 6c 65 20 70 54 61 62 20 68   If table pTab h
110b0 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64  as not been used
110c0 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 77   in a way that w
110d0 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f  ould benefit fro
110e0 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76  m.        ** hav
110f0 69 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61  ing analysis sta
11100 74 69 73 74 69 63 73 20 64 75 72 69 6e 67 20 74  tistics during t
11110 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69  he current sessi
11120 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74  on, then skip it
11130 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  ..        ** Thi
11140 73 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65  s also has the e
11150 66 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e  ffect of skippin
11160 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  g virtual tables
11170 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20   and views */.  
11180 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d        if( (pTab-
11190 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53  >tabFlags & TF_S
111a0 74 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63  tatsUsed)==0 ) c
111b0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
111c0 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69    /* Reanalyze i
111d0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 32  f the table is 2
111e0 35 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74  5 times larger t
111f0 68 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61  han the last ana
11200 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20  lysis */.       
11210 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70   szThreshold = p
11220 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
11230 2b 20 34 36 3b 20 61 73 73 65 72 74 28 20 73 71  + 46; assert( sq
11240 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d  lite3LogEst(25)=
11250 3d 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66  =46 );.        f
11260 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
11270 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
11280 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
11290 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 49           if( !pI
112a0 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a  dx->hasStat1 ){.
112b0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 54 68              szTh
112c0 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20  reshold = 0; /* 
112d0 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69  Always analyze i
112e0 66 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b  f any index lack
112f0 73 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  s statistics */.
11300 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
11310 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
11320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11330 20 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64   if( szThreshold
11340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11350 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
11360 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20  Parse, iTabCur, 
11370 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
11380 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20  enRead);.       
11390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
113a0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61  dOp3(v, OP_IfSma
113b0 6c 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a  ller, iTabCur, .
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
113e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
113f0 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c  v)+2+(opMask&1),
11400 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20   szThreshold);. 
11410 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
11420 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
11430 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62    }.        zSub
11440 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
11450 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a  intf(db, "ANALYZ
11460 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22  E \"%w\".\"%w\""
11470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
114a0 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  zDbSName, pTab->
114b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
114c0 69 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30  if( opMask & 0x0
114d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  1 ){.          i
114e0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
114f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11510 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11520 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
11530 20 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c   r1, 0, zSubSql,
11540 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
11550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11570 52 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31  ResultRow, r1, 1
11580 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11590 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
115a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
115b0 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20   OP_SqlExec, 0, 
115c0 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50  0, 0, zSubSql, P
115d0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
115e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
115f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
11600 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11610 45 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65  Expire);.    bre
11620 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
11630 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79  **   PRAGMA busy
11640 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20  _timeout.  **   
11650 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65  PRAGMA busy_time
11660 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  out = N.  **.  *
11670 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62  * Call sqlite3_b
11680 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20  usy_timeout(db, 
11690 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  N).  Return the 
116a0 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20  current timeout 
116b0 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e  value.  ** if on
116c0 65 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f  e is set.  If no
116d0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72   busy handler or
116e0 20 61 20 64 69 66 66 65 72 65 6e 74 20 62 75 73   a different bus
116f0 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74  y handler is set
11700 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20  .  ** then 0 is 
11710 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69  returned.  Setti
11720 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65  ng the busy_time
11730 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61  out to 0 or nega
11740 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c  tive.  ** disabl
11750 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a  es the timeout..
11760 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72    */.  /*case Pr
11770 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f  agTyp_BUSY_TIMEO
11780 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a  UT*/ default: {.
11790 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 61      assert( pPra
117a0 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50  gma->ePragTyp==P
117b0 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45  ragTyp_BUSY_TIME
117c0 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  OUT );.    if( z
117d0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
117e0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
117f0 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41  out(db, sqlite3A
11800 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20  toi(zRight));.  
11810 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
11820 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62  ngleInt(v, db->b
11830 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20  usyTimeout);.   
11840 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11850 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
11860 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a  soft_heap_limit.
11870 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f    **   PRAGMA so
11880 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20  ft_heap_limit = 
11890 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  N.  **.  ** IMPL
118a0 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
118b0 2d 32 36 33 34 33 2d 34 35 39 33 30 20 54 68 69  -26343-45930 Thi
118c0 73 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73  s pragma invokes
118d0 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
118e0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
118f0 74 36 34 28 29 20 69 6e 74 65 72 66 61 63 65 20  t64() interface 
11900 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e  with the argumen
11910 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a  t N, if N is.  *
11920 2a 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20  * specified and 
11930 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
11940 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20  e integer..  ** 
11950 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
11960 46 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36 33  F: R-64451-07163
11970 20 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c   The soft_heap_l
11980 69 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61  imit pragma alwa
11990 79 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ys.  ** returns 
119a0 74 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72  the same integer
119b0 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72   that would be r
119c0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20  eturned by the. 
119d0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74   ** sqlite3_soft
119e0 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31  _heap_limit64(-1
119f0 29 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e  ) C-language fun
11a00 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
11a10 73 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f  se PragTyp_SOFT_
11a20 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20  HEAP_LIMIT: {.  
11a30 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
11a40 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  N;.    if( zRigh
11a50 74 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  t && sqlite3DecO
11a60 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
11a70 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
11a80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11a90 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
11aa0 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20  t64(N);.    }.  
11ab0 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
11ac0 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66  t(v, sqlite3_sof
11ad0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d  t_heap_limit64(-
11ae0 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
11af0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
11b00 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a   PRAGMA threads.
11b10 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68    **   PRAGMA th
11b20 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20  reads = N.  **. 
11b30 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68   ** Configure th
11b40 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11b50 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
11b60 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ds.  Return the 
11b70 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  new.  ** maximum
11b80 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  , which might be
11b90 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75 65   less than reque
11ba0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  sted..  */.  cas
11bb0 65 20 50 72 61 67 54 79 70 5f 54 48 52 45 41 44  e PragTyp_THREAD
11bc0 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S: {.    sqlite3
11bd0 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66  _int64 N;.    if
11be0 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26  ( zRight.     &&
11bf0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
11c00 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e  ToI64(zRight, &N
11c10 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
11c20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b    && N>=0.    ){
11c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
11c40 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  imit(db, SQLITE_
11c50 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
11c60 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78  EADS, (int)(N&0x
11c70 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20  7fffffff));.    
11c80 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
11c90 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
11ca0 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54  _limit(db, SQLIT
11cb0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
11cc0 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20  HREADS, -1));.  
11cd0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
11ce0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11cf0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
11d00 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
11d10 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74    /*.  ** Report
11d20 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
11d30 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20  te of file logs 
11d40 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
11d50 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  s.  */.  case Pr
11d60 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55  agTyp_LOCK_STATU
11d70 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  S: {.    static 
11d80 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
11d90 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d  t azLockName[] =
11da0 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b   {.      "unlock
11db0 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22  ed", "shared", "
11dc0 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64  reserved", "pend
11dd0 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65  ing", "exclusive
11de0 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
11df0 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
11e00 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f  nMem = 2;.    fo
11e10 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
11e20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
11e30 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20  ree *pBt;.      
11e40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
11e50 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  te = "unknown";.
11e60 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11e70 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
11e80 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20  ].zDbSName==0 ) 
11e90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11ea0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11eb0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11ec0 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  pBt==0 || sqlite
11ed0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
11ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
11ef0 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22  State = "closed"
11f00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11f10 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  ( sqlite3_file_c
11f20 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64  ontrol(db, i ? d
11f30 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
11f40 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20  me : 0, .       
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11f70 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
11f80 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54  TATE, &j)==SQLIT
11f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11fa0 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b   zState = azLock
11fb0 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  Name[j];.      }
11fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11fd0 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
11fe0 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b  , "ss", db->aDb[
11ff0 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74  i].zDbSName, zSt
12000 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ate);.    }.    
12010 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
12020 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
12030 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20  _HAS_CODEC.  /* 
12040 50 72 61 67 6d 61 20 20 20 20 20 20 20 20 69 41  Pragma        iA
12050 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  rg.  ** --------
12060 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  --   ------.  **
12070 20 20 6b 65 79 20 20 20 20 20 20 20 20 20 20 20    key           
12080 30 0a 20 20 2a 2a 20 20 72 65 6b 65 79 20 20 20  0.  **  rekey   
12090 20 20 20 20 20 20 31 0a 20 20 2a 2a 20 20 68 65        1.  **  he
120a0 78 6b 65 79 20 20 20 20 20 20 20 20 32 0a 20 20  xkey        2.  
120b0 2a 2a 20 20 68 65 78 72 65 6b 65 79 20 20 20 20  **  hexrekey    
120c0 20 20 33 0a 20 20 2a 2a 20 20 74 65 78 74 6b 65    3.  **  textke
120d0 79 20 20 20 20 20 20 20 34 0a 20 20 2a 2a 20 20  y       4.  **  
120e0 74 65 78 74 72 65 6b 65 79 20 20 20 20 20 35 0a  textrekey     5.
120f0 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
12100 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20 69  Typ_KEY: {.    i
12110 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
12120 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 61 67     int n = pPrag
12130 6d 61 2d 3e 69 41 72 67 3c 34 20 3f 20 73 71 6c  ma->iArg<4 ? sql
12140 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69  ite3Strlen30(zRi
12150 67 68 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 20  ght) : -1;.     
12160 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69   if( (pPragma->i
12170 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20  Arg & 1)==0 ){. 
12180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b         sqlite3_k
12190 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
121a0 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20 20  Right, n);.     
121b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
121c0 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32  sqlite3_rekey_v2
121d0 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74  (db, zDb, zRight
121e0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
121f0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
12200 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79   }.  case PragTy
12210 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20  p_HEXKEY: {.    
12220 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
12230 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
12240 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
12250 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a   char zKey[40];.
12260 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69        for(i=0, i
12270 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  Byte=0; i<sizeof
12280 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69  (zKey)*2 && sqli
12290 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69 67  te3Isxdigit(zRig
122a0 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ht[i]); i++){.  
122b0 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69        iByte = (i
122c0 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74  Byte<<4) + sqlit
122d0 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68  e3HexToInt(zRigh
122e0 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t[i]);.        i
122f0 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
12300 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
12310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12320 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69 41 72  f( (pPragma->iAr
12330 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20 20 20  g & 1)==0 ){.   
12340 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79       sqlite3_key
12350 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65  _v2(db, zDb, zKe
12360 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d  y, i/2);.      }
12370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
12380 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64  lite3_rekey_v2(d
12390 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f  b, zDb, zKey, i/
123a0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
123b0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
123c0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
123d0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
123e0 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64  ODEC) || defined
123f0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
12400 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61  EROD).  case Pra
12410 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58  gTyp_ACTIVATE_EX
12420 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52  TENSIONS: if( zR
12430 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53  ight ){.#ifdef S
12440 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
12450 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
12460 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
12470 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b  "see-", 4)==0 ){
12480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61  .      sqlite3_a
12490 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69  ctivate_see(&zRi
124a0 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23  ght[4]);.    }.#
124b0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
124c0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44  ITE_ENABLE_CEROD
124d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
124e0 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
124f0 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30   "cerod-", 6)==0
12500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12510 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64  3_activate_cerod
12520 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20  (&zRight[6]);.  
12530 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
12540 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
12550 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
12560 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20  e PRAGMA switch 
12570 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
12580 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73 20  lowing block is 
12590 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
125a0 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
125b0 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79  efined. Its only
125c0 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69 73  .  ** purpose is
125d0 20 74 6f 20 65 78 65 63 75 74 65 20 61 73 73 65   to execute asse
125e0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
125f0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 69  to verify that i
12600 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67 46  f the.  ** PragF
12610 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c  lg_NoColumns1 fl
12620 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
12630 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  e caller specifi
12640 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20  ed an argument. 
12650 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47 4d   ** to the PRAGM
12660 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  A, the implement
12670 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61 64  ation has not ad
12680 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c  ded any OP_Resul
12690 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74 72  tRow .  ** instr
126a0 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 56  uctions to the V
126b0 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  M.  */.  if( (pP
126c0 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
126d0 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  & PragFlg_NoColu
126e0 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74 20  mns1) && zRight 
126f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12700 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
12710 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72 61  Row(v);.  }..pra
12720 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  gma_out:.  sqlit
12730 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65  e3DbFree(db, zLe
12740 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ft);.  sqlite3Db
12750 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29  Free(db, zRight)
12760 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
12770 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12780 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ABLE./**********
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ***.** Implement
127e0 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f 6e  ation of an epon
127f0 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
12800 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61 20  ble that runs a 
12810 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79  pragma..**.*/.ty
12820 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
12830 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56 74  gmaVtab PragmaVt
12840 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ab;.typedef stru
12850 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  ct PragmaVtabCur
12860 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43 75  sor PragmaVtabCu
12870 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72 61  rsor;.struct Pra
12880 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c 69  gmaVtab {.  sqli
12890 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20  te3_vtab base;  
128a0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c        /* Base cl
128b0 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69  ass.  Must be fi
128c0 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rst */.  sqlite3
128d0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
128e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
128f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
12900 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e 67   which it belong
12910 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72 61  s */.  const Pra
12920 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 20  gmaName *pName; 
12930 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12940 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20 6e  pragma */.  u8 n
12950 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20  Hidden;         
12960 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12970 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  of hidden column
12980 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64 65  s */.  u8 iHidde
12990 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
129a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
129b0 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 63 6f   first hidden co
129c0 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  lumn */.};.struc
129d0 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  t PragmaVtabCurs
129e0 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  or {.  sqlite3_v
129f0 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
12a00 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20   /* Base class. 
12a10 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
12a20 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
12a30 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f 2a   *pPragma;    /*
12a40 20 54 68 65 20 70 72 61 67 6d 61 20 73 74 61 74   The pragma stat
12a50 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a  ement to run */.
12a60 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
12a70 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43  Rowid;      /* C
12a80 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
12a90 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32 5d    char *azArg[2]
12aa0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
12ab0 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67 75  alue of the argu
12ac0 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61 20  ment and schema 
12ad0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  */.};../* .** Pr
12ae0 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
12af0 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65  le module xConne
12b00 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ct method..*/.st
12b10 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
12b20 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  tabConnect(.  sq
12b30 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
12b40 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
12b50 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
12b60 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
12b70 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
12b80 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
12b90 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  zErr.){.  const 
12ba0 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61  PragmaName *pPra
12bb0 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72 61  gma = (const Pra
12bc0 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a 20  gmaName*)pAux;. 
12bd0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
12be0 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  b = 0;.  int rc;
12bf0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
12c00 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
12c10 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a    StrAccum acc;.
12c20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
12c30 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
12c40 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55  METER(argc);.  U
12c50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12c60 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  argv);.  sqlite3
12c70 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63  StrAccumInit(&ac
12c80 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a 65  c, 0, zBuf, size
12c90 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20  of(zBuf), 0);.  
12ca0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
12cb0 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22 43 52 45  ndall(&acc, "CRE
12cc0 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b 0a 20  ATE TABLE x");. 
12cd0 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72 61   for(i=0, j=pPra
12ce0 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65 3b  gma->iPragCName;
12cf0 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61   i<pPragma->nPra
12d00 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b 2b  gCName; i++, j++
12d10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
12d20 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c  tr_appendf(&acc,
12d30 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53 65   "%c\"%s\"", cSe
12d40 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29  p, pragCName[j])
12d50 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27  ;.    cSep = ','
12d60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 30  ;.  }.  if( i==0
12d70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12d80 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63  str_appendf(&acc
12d90 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50 72  , "(\"%s\"", pPr
12da0 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  agma->zName);.  
12db0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d    i++;.  }.  j =
12dc0 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d   0;.  if( pPragm
12dd0 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
12de0 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29 7b  agFlg_Result1 ){
12df0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
12e00 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
12e10 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22 29 3b   ",arg HIDDEN");
12e20 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
12e30 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
12e40 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
12e50 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61 67 46  _SchemaOpt|PragF
12e60 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20 29 7b  lg_SchemaReq) ){
12e70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
12e80 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
12e90 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45 4e   ",schema HIDDEN
12ea0 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  ");.    j++;.  }
12eb0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
12ec0 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29 22 2c  ppend(&acc, ")",
12ed0 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
12ee0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63  rAccumFinish(&ac
12ef0 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74  c);.  assert( st
12f00 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73 69 7a  rlen(zBuf) < siz
12f10 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a 20  eof(zBuf)-1 );. 
12f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
12f30 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a  clare_vtab(db, z
12f40 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
12f50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12f60 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56   pTab = (PragmaV
12f70 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  tab*)sqlite3_mal
12f80 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61 67 6d  loc(sizeof(Pragm
12f90 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69 66 28  aVtab));.    if(
12fa0 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
12fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12fc0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
12fd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 61        memset(pTa
12fe0 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  b, 0, sizeof(Pra
12ff0 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 20  gmaVtab));.     
13000 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20 70   pTab->pName = p
13010 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20 70 54  Pragma;.      pT
13020 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ab->db = db;.   
13030 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e     pTab->iHidden
13040 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62   = i;.      pTab
13050 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a 20  ->nHidden = j;. 
13060 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13070 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
13080 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
13090 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
130a0 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  db));.  }..  *pp
130b0 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
130c0 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65  vtab*)pTab;.  re
130d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
130e0 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
130f0 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
13100 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  Disconnect metho
13110 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13120 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
13130 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
13140 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 50 72  ab *pVtab){.  Pr
13150 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
13160 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 70 56   (PragmaVtab*)pV
13170 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  tab;.  sqlite3_f
13180 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65 74  ree(pTab);.  ret
13190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
131a0 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20  ../* Figure out 
131b0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
131c0 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68 20  o use to search 
131d0 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
131e0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
131f0 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65 61 6c  ere are not real
13200 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63 68 6f  ly any index cho
13210 69 63 65 73 2e 20 20 42 75 74 20 77 65 20 77 61  ices.  But we wa
13220 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  nt to encourage 
13230 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61  the.** query pla
13240 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d 3d 20  nner to give == 
13250 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
13260 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20 70 61  s many hidden pa
13270 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20 70  rameters as.** p
13280 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65 73 70  ossible, and esp
13290 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20 66  ecially on the f
132a0 69 72 73 74 20 68 69 64 64 65 6e 20 70 61 72 61  irst hidden para
132b0 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74 75 72  meter.  So retur
132c0 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73 74  n a.** high cost
132d0 20 69 66 20 68 69 64 64 65 6e 20 70 61 72 61 6d   if hidden param
132e0 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f 6e 73  eters are uncons
132f0 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  trained..*/.stat
13300 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
13310 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  bBestIndex(sqlit
13320 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
13330 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13340 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 50   *pIdxInfo){.  P
13350 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
13360 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 74  = (PragmaVtab*)t
13370 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  ab;.  const stru
13380 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13390 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  _constraint *pCo
133a0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
133b0 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65 6e  i, j;.  int seen
133c0 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66 6f  [2];..  pIdxInfo
133d0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
133e0 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69  = (double)1;.  i
133f0 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e  f( pTab->nHidden
13400 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 53 51  ==0 ){ return SQ
13410 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43 6f  LITE_OK; }.  pCo
13420 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
13430 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13440 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30 3b  ;.  seen[0] = 0;
13450 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b 0a  .  seen[1] = 0;.
13460 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
13470 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
13480 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72  nt; i++, pConstr
13490 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28  aint++){.    if(
134a0 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73   pConstraint->us
134b0 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  able==0 ) contin
134c0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
134d0 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c  straint->op!=SQL
134e0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
134f0 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e  AINT_EQ ) contin
13500 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
13510 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e  straint->iColumn
13520 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   < pTab->iHidden
13530 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13540 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74   j = pConstraint
13550 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61 62  ->iColumn - pTab
13560 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20 20 61  ->iHidden;.    a
13570 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29 3b 0a  ssert( j < 2 );.
13580 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b      seen[j] = i+
13590 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65 65  1;.  }.  if( see
135a0 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  n[0]==0 ){.    p
135b0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
135c0 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
135d0 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20  )2147483647;.   
135e0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
135f0 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37 34  atedRows = 21474
13600 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75 72  83647;.    retur
13610 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13620 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d 31  .  j = seen[0]-1
13630 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
13640 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
13650 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b  ].argvIndex = 1;
13660 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
13670 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
13680 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  .omit = 1;.  if(
13690 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72 65   seen[1]==0 ) re
136a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
136b0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
136c0 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
136d0 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49 6e  ble)20;.  pIdxIn
136e0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
136f0 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73 65  s = 20;.  j = se
13700 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78 49  en[1]-1;.  pIdxI
13710 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13720 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64  Usage[j].argvInd
13730 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e  ex = 2;.  pIdxIn
13740 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
13750 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31  sage[j].omit = 1
13760 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13770 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61  E_OK;.}../* Crea
13780 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
13790 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20 76  for the pragma v
137a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
137b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
137c0 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74 65  aVtabOpen(sqlite
137d0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73  3_vtab *pVtab, s
137e0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
137f0 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a  or **ppCursor){.
13800 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
13810 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72  or *pCsr;.  pCsr
13820 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13830 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  rsor*)sqlite3_ma
13840 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43 73  lloc(sizeof(*pCs
13850 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72 3d  r));.  if( pCsr=
13860 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13870 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
13880 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
13890 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  of(PragmaVtabCur
138a0 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62  sor));.  pCsr->b
138b0 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74 61  ase.pVtab = pVta
138c0 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  b;.  *ppCursor =
138d0 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20   &pCsr->base;.  
138e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138f0 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61 6c  ;.}../* Clear al
13900 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  l content from p
13910 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
13920 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 73  ble cursor. */.s
13930 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67 6d  tatic void pragm
13940 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13950 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
13960 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20  r *pCsr){.  int 
13970 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  i;.  sqlite3_fin
13980 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61  alize(pCsr->pPra
13990 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70 50  gma);.  pCsr->pP
139a0 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f 72  ragma = 0;.  for
139b0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
139c0 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b 20  e(pCsr->azArg); 
139d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
139e0 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a 41  3_free(pCsr->azA
139f0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73 72  rg[i]);.    pCsr
13a00 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b 0a  ->azArg[i] = 0;.
13a10 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20    }.}../* Close 
13a20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
13a30 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f   table cursor */
13a40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
13a50 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c 69  maVtabClose(sqli
13a60 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
13a70 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  *cur){.  PragmaV
13a80 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
13a90 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
13aa0 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61 67  sor*)cur;.  prag
13ab0 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13ac0 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  r(pCsr);.  sqlit
13ad0 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20  e3_free(pCsr);. 
13ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13af0 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65  K;.}../* Advance
13b00 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72 74   the pragma virt
13b10 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
13b20 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
13b30 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
13b40 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 73 71  ragmaVtabNext(sq
13b50 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13b60 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b  r *pVtabCursor){
13b70 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13b80 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13b90 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13ba0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e  VtabCursor;.  in
13bb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13bc0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
13bd0 74 20 74 68 65 20 78 52 6f 77 69 64 20 76 61 6c  t the xRowid val
13be0 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52  ue */.  pCsr->iR
13bf0 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72 74  owid++;.  assert
13c00 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20  ( pCsr->pPragma 
13c10 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
13c20 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW!=sqlite3_ste
13c30 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29  p(pCsr->pPragma)
13c40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13c50 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
13c60 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20  sr->pPragma);.  
13c70 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13c80 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d 61 56  = 0;.    pragmaV
13c90 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70  tabCursorClear(p
13ca0 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Csr);.  }.  retu
13cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
13cc0 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
13cd0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69  table module xFi
13ce0 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  lter method..*/.
13cf0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13d00 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20 20 73  aVtabFilter(.  s
13d10 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13d20 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
13d30 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
13d40 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
13d50 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
13d60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
13d70 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d 61  argv.){.  Pragma
13d80 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13d90 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13da0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
13db0 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
13dc0 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
13dd0 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
13de0 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74  r->pVtab);.  int
13df0 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   rc;.  int i, j;
13e00 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b  .  StrAccum acc;
13e10 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a  .  char *zSql;..
13e20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13e30 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55 4e  ER(idxNum);.  UN
13e40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
13e50 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67 6d 61  dxStr);.  pragma
13e60 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
13e70 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70 54  pCsr);.  j = (pT
13e80 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61 67  ab->pName->mPrag
13e90 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
13ea0 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a 20  sult1)!=0 ? 0 : 
13eb0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
13ec0 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  argc; i++, j++){
13ed0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13ee0 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
13ef0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
13f00 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
13f10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  );.    assert( j
13f20 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d  <ArraySize(pCsr-
13f30 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 61  >azArg) );.    a
13f40 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 7a 41  ssert( pCsr->azA
13f50 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  rg[j]==0 );.    
13f60 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
13f70 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a     pCsr->azArg[j
13f80 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
13f90 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78 74 29  ntf("%s", zText)
13fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72  ;.      if( pCsr
13fb0 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b  ->azArg[j]==0 ){
13fc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13fd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13fe0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13ff0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
14000 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 30  mInit(&acc, 0, 0
14010 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d 3e 61  , 0, pTab->db->a
14020 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14030 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b  IT_SQL_LENGTH]);
14040 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
14050 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22  ppendall(&acc, "
14060 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28  PRAGMA ");.  if(
14070 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20   pCsr->azArg[1] 
14080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
14090 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c  tr_appendf(&acc,
140a0 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e 61 7a   "%Q.", pCsr->az
140b0 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 73  Arg[1]);.  }.  s
140c0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
140d0 64 61 6c 6c 28 26 61 63 63 2c 20 70 54 61 62 2d  dall(&acc, pTab-
140e0 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  >pName->zName);.
140f0 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
14100 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  g[0] ){.    sqli
14110 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
14120 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70 43 73  &acc, "=%Q", pCs
14130 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  r->azArg[0]);.  
14140 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  }.  zSql = sqlit
14150 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
14160 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20 7a 53  (&acc);.  if( zS
14170 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ql==0 ) return S
14180 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
14190 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
141a0 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64 62 2c  are_v2(pTab->db,
141b0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73 72   zSql, -1, &pCsr
141c0 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a 20  ->pPragma, 0);. 
141d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
141e0 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ql);.  if( rc!=S
141f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14200 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  pTab->base.zErrM
14210 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
14220 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
14230 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62 2d 3e  e3_errmsg(pTab->
14240 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  db));.    return
14250 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
14260 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74  n pragmaVtabNext
14270 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d  (pVtabCursor);.}
14280 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ../*.** Pragma v
14290 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
142a0 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e  ule xEof method.
142b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
142c0 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73 71 6c  ragmaVtabEof(sql
142d0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
142e0 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a   *pVtabCursor){.
142f0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
14300 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
14310 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
14320 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65 74  tabCursor;.  ret
14330 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72 61 67  urn (pCsr->pPrag
14340 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54 68  ma==0);.}../* Th
14350 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  e xColumn method
14360 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20   simply returns 
14370 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
14380 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  g column from.**
14390 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20 0a 2a   the PRAGMA.  .*
143a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
143b0 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a 20  gmaVtabColumn(. 
143c0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
143d0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
143e0 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  r, .  sqlite3_co
143f0 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20 69  ntext *ctx, .  i
14400 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d 61  nt i.){.  Pragma
14410 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
14420 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
14430 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
14440 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
14450 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
14460 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
14470 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28  r->pVtab);.  if(
14480 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   i<pTab->iHidden
14490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
144a0 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
144b0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
144c0 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 50 72  _value(pCsr->pPr
144d0 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65 6c  agma, i));.  }el
144e0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
144f0 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
14500 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d 70   pCsr->azArg[i-p
14510 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d 31  Tab->iHidden],-1
14520 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
14530 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T);.  }.  return
14540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14550 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
14560 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
14570 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e  e xRowid method.
14580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14590 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64 28 73  ragmaVtabRowid(s
145a0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
145b0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
145c0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
145d0 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
145e0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
145f0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
14600 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
14610 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77 69  *p = pCsr->iRowi
14620 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
14630 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
14640 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
14650 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  table object */.
14660 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
14670 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61 67  ite3_module prag
14680 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20 7b  maVtabModule = {
14690 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
146c0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146e0 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61 74   xCreate - creat
146f0 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  e a table */.  p
14700 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
14710 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
14720 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63  Connect - connec
14730 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  t to an existing
14740 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67   table */.  prag
14750 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 2c  maVtabBestIndex,
14760 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73           /* xBes
14770 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69  tIndex - Determi
14780 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74 65  ne search strate
14790 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  gy */.  pragmaVt
147a0 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  abDisconnect,   
147b0 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
147c0 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74  ect - Disconnect
147d0 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f   from a table */
147e0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72  /* xDestroy - Dr
14810 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  op a table */.  
14820 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c 20  pragmaVtabOpen, 
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14840 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
14850 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
14860 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20 20 20  aVtabClose,     
14870 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
14880 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
14890 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
148a0 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  abFilter,       
148b0 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
148c0 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
148d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
148e0 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74    pragmaVtabNext
148f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14900 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
14910 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
14920 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c 20 20  pragmaVtabEof,  
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14940 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d 61  xEof */.  pragma
14950 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  VtabColumn,     
14960 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
14970 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
14980 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77  .  pragmaVtabRow
14990 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
149a0 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
149b0 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
149e0 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61 20  te - write data 
149f0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65    /* xBegin - be
14a20 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
14a30 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e    /* xSync - syn
14a60 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  c transaction */
14a70 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d  /* xCommit - com
14aa0 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mit transaction 
14ab0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d    /* xRollback -
14ae0 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
14af0 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
14b20 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74  Function - funct
14b30 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20  ion overloading 
14b40 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72    /* xRename - r
14b70 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20  ename the table 
14b80 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
14bb0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
14be0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a  /* xRollbackTo *
14c10 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65 20   /* xShadowName 
14c40 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  */.};../*.** Che
14c50 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54 61  ck to see if zTa
14c60 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79 20  bName is really 
14c70 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70 72  the name of a pr
14c80 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73 2c  agma.  If it is,
14c90 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74 65  .** then registe
14ca0 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76  r an eponymous v
14cb0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72  irtual table for
14cc0 20 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e 64   that pragma and
14cd0 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
14ce0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64 75  nter to the Modu
14cf0 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
14d00 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61  e new virtual ta
14d10 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20 2a  ble..*/.Module *
14d20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61  sqlite3PragmaVta
14d30 62 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  bRegister(sqlite
14d40 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
14d50 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e  r *zName){.  con
14d60 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
14d70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
14d80 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
14d90 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f  (zName, "pragma_
14da0 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 4e  ", 7)==0 );.  pN
14db0 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61  ame = pragmaLoca
14dc0 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20 69  te(zName+7);.  i
14dd0 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( pName==0 ) re
14de0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
14df0 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26  Name->mPragFlg &
14e00 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74   (PragFlg_Result
14e10 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74  0|PragFlg_Result
14e20 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  1))==0 ) return 
14e30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
14e40 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
14e50 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65  ->aModule, zName
14e60 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
14e70 20 73 71 6c 69 74 65 33 56 74 61 62 43 72 65 61   sqlite3VtabCrea
14e80 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61  teModule(db, zNa
14e90 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62 4d  me, &pragmaVtabM
14ea0 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70 4e  odule, (void*)pN
14eb0 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e 64  ame, 0);.}..#end
14ec0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14ed0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
14ee0 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
14ef0 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20  ITE_OMIT_PRAGMA 
14f00 2a 2f 0a                                         */.