/ Hex Artifact Content
Login

Artifact 2b67263250c99f068114741dd3773a75fc3a04319e5a27713df2f5522a0e6b77:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  K );.    while( 
1ba0: 28 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20  (n--) > 0 ){.   
1bb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1bc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
1be0: 6c 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20  lags(pDb->pBt,. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  (pDb->safety_lev
1c10: 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  el & PAGER_SYNCH
1c20: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 0a 20 20 20  RONOUS_MASK).   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1c50: 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1c60: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c70: 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pDb++;.    }. 
1c80: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1c90: 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72 46  ine setAllPagerF
1ca0: 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d 6f  lags(X)  /* no-o
1cb0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
1cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75 6d  .** Return a hum
1cd0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d 65  an-readable name
1ce0: 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   for a constrain
1cf0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63 74  t resolution act
1d00: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
1d20: 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20 63  IGN_KEY.static c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69 6f  onst char *actio
1d40: 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e 29  nName(u8 action)
1d50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d60: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
1d70: 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 63   action ){.    c
1d80: 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a 20  ase OE_SetNull: 
1d90: 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e 55   zName = "SET NU
1da0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
1db0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53  k;.    case OE_S
1dc0: 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20 3d  etDflt:  zName =
1dd0: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b 20   "SET DEFAULT"; 
1de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1df0: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
1e00: 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41 44   zName = "CASCAD
1e10: 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  E";         brea
1e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  k;.    case OE_R
1e30: 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20 3d  estrict: zName =
1e40: 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20 20   "RESTRICT";    
1e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1e60: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1e70: 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43 54   zName = "NO ACT
1e80: 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20 20  ION";  .        
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ea0: 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f 45  sert( action==OE
1eb0: 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b 0a  _None ); break;.
1ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
1ed0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
1ee0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
1ef0: 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
1f00: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
1f10: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63 6f  URNALMODE_XXX co
1f20: 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69 6e  nstants.** defin
1f30: 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20 54  ed in pager.h. T
1f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f50: 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69 61  urns the associa
1f60: 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a 2a  ted lowercase.**
1f70: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e 61   journal-mode na
1f80: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
1f90: 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  r *sqlite3Journa
1fa0: 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65 4d  lModename(int eM
1fb0: 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ode){.  static c
1fc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d 6f  har * const azMo
1fd0: 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  deName[] = {.   
1fe0: 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72 73   "delete", "pers
1ff0: 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74 72  ist", "off", "tr
2000: 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72 79  uncate", "memory
2010: 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 2c  _OMIT_WAL.     ,
2030: 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20 20   "wal".#endif.  
2040: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  };.  assert( PAG
2050: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2060: 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61 73  ELETE==0 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3d  NALMODE_PERSIST=
2090: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b0: 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61 73  E_OFF==2 );.  as
20c0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20d0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20e0: 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
20f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2100: 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b 0a  DE_MEMORY==4 );.
2110: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3d  JOURNALMODE_WAL=
2130: 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
2140: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
2150: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
2160: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
2170: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
2180: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
2190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21a0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
21b0: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
21c0: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
21d0: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
21e0: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2200: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2210: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2220: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2230: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2240: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
2250: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
2260: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
2270: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
2280: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
2290: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
22c0: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
22d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
22e0: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
22f0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2300: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2310: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2320: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2330: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2340: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
2350: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
2360: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
2370: 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75 74  * Helper subrout
2380: 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20 69  ine for PRAGMA i
2390: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a 0a  ntegrity_check:.
23a0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  **.** Generate c
23b0: 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61 20  ode to output a 
23c0: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72 65  single-column re
23d0: 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61 20  sult row with a 
23e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
23f0: 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20 72  string held in r
2400: 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63 72  egister 3.  Decr
2410: 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74  ement the result
2420: 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73 74   count in regist
2430: 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c 74  er 1.** and halt
2440: 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   if the maximum 
2450: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2460: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2470: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2480: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
2490: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24a0: 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61 64  be *v){.  int ad
24b0: 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dr;.  sqlite3Vdb
24c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
24d0: 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a  sultRow, 3, 1);.
24e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
24f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2500: 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69 74  _IfPos, 1, sqlit
2510: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2520: 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56 64  r(v)+2, 1);.  Vd
2530: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2550: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
2560: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
2580: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
2590: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
25a0: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
25b0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
25c0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
25d0: 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a  ]id [= value].**
25e0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
25f0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
2600: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
2610: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
2620: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
2630: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
2640: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
2650: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2660: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
2670: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
2680: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
2690: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
26a0: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
26b0: 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69  e is "database.i
26c0: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
26d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
26e0: 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73  e.** and pId2 is
26f0: 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65   the id.  If the
2700: 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75   left side is ju
2710: 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64  st "id" then pId
2720: 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61  1 is the.** id a
2730: 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65  nd pId2 is any e
2740: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
2750: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67  void sqlite3Prag
2760: 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ma(.  Parse *pPa
2770: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
2780: 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  Id1,        /* F
2790: 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73 63  irst part of [sc
27a0: 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a  hema.]id field *
27b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c  /.  Token *pId2,
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
27d0: 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  d part of [schem
27e0: 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20  a.]id field, or 
27f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
2800: 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a  *pValue,      /*
2810: 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75   Token for <valu
2820: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2830: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20 20   int minusFlag  
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2850: 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63 65  a '-' sign prece
2860: 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29  ded <value> */.)
2870: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20  {.  char *zLeft 
2880: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2890: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28a0: 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a  -8 string <id> *
28b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  /.  char *zRight
28c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
28d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28e0: 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65  -8 string <value
28f0: 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  >, or NULL */.  
2900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
2910: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  = 0;   /* The da
2920: 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
2930: 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20   Token *pId;    
2940: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2950: 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e  er to <id> token
2960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63 6e   */.  char *aFcn
2970: 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20  tl[4];       /* 
2980: 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49  Argument to SQLI
2990: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
29a0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
29c0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66 6f  atabase index fo
29d0: 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a  r <database> */.
29e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * return value f
2a10: 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  orm SQLITE_FCNTL
2a20: 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c  _PRAGMA */.  sql
2a30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2a40: 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65  e->db;    /* The
2a50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a60: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2a70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2a80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
2a90: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
2aa0: 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a  being pragmaed *
2ab0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
2ac0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2ad0: 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72  rse);  /* Prepar
2ae0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
2af0: 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
2b00: 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f  me *pPragma;   /
2b10: 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  * The pragma */.
2b20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2b30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
2b40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76  dbeRunOnlyOnce(v
2b50: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
2b60: 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74  m = 2;..  /* Int
2b70: 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68 65  erpret the [sche
2b80: 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68 65  ma.] part of the
2b90: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
2ba0: 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20 20  t. iDb is the.  
2bb0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
2bc0: 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70 72  database this pr
2bd0: 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61 70  agma is being ap
2be0: 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e 61  plied to in db.a
2bf0: 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d  Db[]. */.  iDb =
2c00: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
2c10: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64 31  ame(pParse, pId1
2c20: 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a 20  , pId2, &pId);. 
2c30: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
2c40: 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  urn;.  pDb = &db
2c50: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f  ->aDb[iDb];..  /
2c60: 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64 61  * If the temp da
2c70: 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
2c80: 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64  explicitly named
2c90: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2ca0: 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61  .  ** pragma, ma
2cb0: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f 70  ke sure it is op
2cc0: 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  en. .  */.  if( 
2cd0: 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  iDb==1 && sqlite
2ce0: 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
2cf0: 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  e(pParse) ){.   
2d00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2d10: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 4e  zLeft = sqlite3N
2d20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2d30: 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c   pId);.  if( !zL
2d40: 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  eft ) return;.  
2d50: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
2d60: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2d70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2d80: 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29 3b   "-%T", pValue);
2d90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
2da0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e 61  ight = sqlite3Na
2db0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
2dc0: 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  pValue);.  }..  
2dd0: 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b 0a  assert( pId2 );.
2de0: 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e    zDb = pId2->n>
2df0: 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  0 ? pDb->zDbSNam
2e00: 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  e : 0;.  if( sql
2e10: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2e20: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41  arse, SQLITE_PRA
2e30: 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67  GMA, zLeft, zRig
2e40: 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ht, zDb) ){.    
2e50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
2e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20  .  }..  /* Send 
2e70: 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  an SQLITE_FCNTL_
2e80: 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74  PRAGMA file-cont
2e90: 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65 72  rol to the under
2ea0: 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63  lying VFS.  ** c
2eb0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 69  onnection.  If i
2ec0: 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
2ed0: 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  _OK, then assume
2ee0: 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20 20   that the VFS.  
2ef0: 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20 70  ** handled the p
2f00: 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72 61  ragma and genera
2f10: 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61  te a no-op prepa
2f20: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
2f30: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2f40: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32  NTATION-OF: R-12
2f50: 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65 76  238-55120 Whenev
2f60: 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61 74  er a PRAGMA stat
2f70: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
2f80: 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f  .  ** an SQLITE_
2f90: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c  FCNTL_PRAGMA fil
2fa0: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e  e control is sen
2fb0: 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73 71  t to the open sq
2fc0: 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20  lite3_file.  ** 
2fd0: 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
2fe0: 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ding to the data
2ff0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68 69  base file to whi
3000: 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20 20  ch the pragma.  
3010: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66  ** statement ref
3020: 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ers..  **.  ** I
3030: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
3040: 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38 20  : R-29875-31678 
3050: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
3060: 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
3070: 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c  _PRAGMA.  ** fil
3080: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20  e control is an 
3090: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
30a0: 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63 68  s to strings (ch
30b0: 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20 74  ar**) in which t
30c0: 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65  he.  ** second e
30d0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72  lement of the ar
30e0: 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ray is the name 
30f0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e  of the pragma an
3100: 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a 2a  d the third.  **
3110: 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
3120: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3130: 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69  pragma or NULL i
3140: 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61 73  f the pragma has
3150: 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e   no.  ** argumen
3160: 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c  t..  */.  aFcntl
3170: 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74  [0] = 0;.  aFcnt
3180: 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  l[1] = zLeft;.  
3190: 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67  aFcntl[2] = zRig
31a0: 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20  ht;.  aFcntl[3] 
31b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
31c0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
31d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
31e0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
31f0: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
3200: 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69  NTL_PRAGMA, (voi
3210: 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66  d*)aFcntl);.  if
3220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3230: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
3240: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
3250: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3260: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3270: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
3280: 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c  , aFcntl[0], SQL
3290: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
32a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
32b0: 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30  Text(v, aFcntl[0
32c0: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
32d0: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
32e0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
32f0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
3300: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
3310: 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 61  UND ){.    if( a
3320: 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  Fcntl[0] ){.    
3330: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3340: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
3350: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
3360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
3370: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  Fcntl[0]);.    }
3380: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
3390: 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  r++;.    pParse-
33a0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f  >rc = rc;.    go
33b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
33c0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
33d0: 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74 68  the pragma in th
33e0: 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a  e lookup table *
33f0: 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70 72  /.  pPragma = pr
3400: 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74  agmaLocate(zLeft
3410: 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  );.  if( pPragma
3420: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  ==0 ) goto pragm
3430: 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  a_out;..  /* Mak
3440: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
3450: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  ase schema is lo
3460: 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61 67  aded if the prag
3470: 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ma requires that
3480: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67   */.  if( (pPrag
3490: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
34a0: 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d  ragFlg_NeedSchem
34b0: 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  a)!=0 ){.    if(
34c0: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
34d0: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
34e0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
34f0: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
3500: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
3510: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72 61  mn names for pra
3520: 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72 6e  gmas that return
3530: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66   results */.  if
3540: 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  ( (pPragma->mPra
3550: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
3560: 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20  oColumns)==0 .  
3570: 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d   && ((pPragma->m
3580: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
3590: 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30  g_NoColumns1)==0
35a0: 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20   || zRight==0). 
35b0: 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67 6d   ){.    setPragm
35c0: 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d  aResultColumnNam
35d0: 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a  es(v, pPragma);.
35e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
35f0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
3600: 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65 72  e pragma handler
3610: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 50   */.  switch( pP
3620: 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 20  ragma->ePragTyp 
3630: 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ){.  .#if !defin
3640: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
3650: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26 26  AGER_PRAGMAS) &&
3660: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3670: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
3680: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
3690: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66  GMA [schema.]def
36a0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
36b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
36c0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
36d0: 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a  che_size=N.  **.
36e0: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
36f0: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
3700: 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65  current persiste
3710: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
3720: 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
3730: 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61  he size.  The va
3740: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
3750: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3760: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
3770: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
3780: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
3790: 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74  form sets both t
37a0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
37b0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
37c0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65  value and the pe
37d0: 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61  rsistent page ca
37e0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20  che size value. 
37f0: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
3800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72  .  **.  ** Older
3820: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
3830: 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74 68  ite would set th
3840: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
3850: 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e  size to a.  ** n
3860: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 74  egative number t
3870: 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63 68  o indicate synch
3880: 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65  ronous=OFF.  The
3890: 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72 6f  se days, synchro
38a0: 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77  nous.  ** is alw
38b0: 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c  ays on by defaul
38c0: 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  t regardless of 
38d0: 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65 20  the sign of the 
38e0: 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20  default cache.  
38f0: 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63 6f  ** size.  But co
3900: 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20 74  ntinue to take t
3910: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
3920: 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  e of the default
3930: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3940: 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20 63   of historical c
3950: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20  ompatibility..  
3960: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
3970: 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  p_DEFAULT_CACHE_
3980: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61 74  SIZE: {.    stat
3990: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
39a0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
39b0: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
39c0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
39d0: 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53 69  pList getCacheSi
39e0: 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
39f0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
3a00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2a            /* 0 *
3a30: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  /.      { OP_Rea
3a40: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20  dCookie,  0, 1, 
3a50: 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45 46         BTREE_DEF
3a60: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d  AULT_CACHE_SIZE}
3a70: 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  ,  /* 1 */.     
3a80: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
3a90: 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20     1, 8,        
3aa0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
3ab0: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 32  nteger,     0, 2
3ac0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3ad0: 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63 74     { OP_Subtract
3ae0: 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20  ,    1, 2,      
3af0: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
3b00: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
3b10: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
3b20: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
3b30: 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  r,     0, 1,    
3b40: 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20      0},         
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
3b70: 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
3b80: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
3b90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75  .      { OP_Resu
3ba0: 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20  ltRow,   1, 1,  
3bb0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
3bc0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  .    VdbeOp *aOp
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3be0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
3bf0: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  b);.    if( !zRi
3c00: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ght ){.      pPa
3c10: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
3c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c30: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
3c40: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
3c50: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
3c60: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
3c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c80: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
3c90: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
3ca0: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c 20  , getCacheSize, 
3cb0: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  iLn);.      if( 
3cc0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
3cd0: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
3ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f   break;.      aO
3cf0: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
3d00: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d       aOp[1].p1 =
3d10: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
3d20: 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f 44  6].p1 = SQLITE_D
3d30: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
3d40: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
3d50: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 73      int size = s
3d60: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73  qlite3AbsInt32(s
3d70: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
3d80: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
3d90: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
3da0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3db0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
3dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3dd0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
3de0: 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41 55  iDb, BTREE_DEFAU
3df0: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 73  LT_CACHE_SIZE, s
3e00: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
3e10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3e20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3e30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
3e40: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
3e50: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
3e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3e70: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
3e80: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
3e90: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
3ea0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
3eb0: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
3ec0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3ed0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 26  _PAGER_PRAGMAS &
3ee0: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  & !SQLITE_OMIT_D
3ef0: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69  EPRECATED */..#i
3f00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3f10: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
3f20: 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  GMAS).  /*.  ** 
3f30: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f40: 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  ]page_size.  ** 
3f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f60: 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  ]page_size=N.  *
3f70: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
3f80: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
3f90: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
3fa0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64  g for the.  ** d
3fb0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
3fc0: 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  e in bytes.  The
3fd0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
3fe0: 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  s the.  ** datab
3ff0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76 61  ase page size va
4000: 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  lue.  The value 
4010: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  can only be set 
4020: 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  if.  ** the data
4030: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65 74  base has not yet
4040: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a 20   been created.. 
4050: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
4060: 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a  yp_PAGE_SIZE: {.
4070: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4080: 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61   pDb->pBt;.    a
4090: 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b  ssert( pBt!=0 );
40a0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
40b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69   ){.      int si
40c0: 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74 29  ze = ALWAYS(pBt)
40d0: 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   ? sqlite3BtreeG
40e0: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 20  etPageSize(pBt) 
40f0: 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  : 0;.      retur
4100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69  nSingleInt(v, si
4110: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
4120: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20        /* Malloc 
4130: 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73 65  may fail when se
4140: 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d 73  tting the page-s
4150: 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69 73  ize, as there is
4160: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20   an internal.   
4170: 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68 61     ** buffer tha
4180: 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64 75  t the pager modu
4190: 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e 67  le resizes using
41a0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
41b0: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
41c0: 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73     db->nextPages
41d0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  ize = sqlite3Ato
41e0: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
41f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
4200: 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
4210: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
4220: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4230: 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  ,-1,0) ){.      
4240: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
4250: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t(db);.      }. 
4260: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
4270: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4280: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4290: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
42a0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
42b0: 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74  ma.]secure_delet
42c0: 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20  e=ON/OFF/FAST.  
42d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
42e0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
42f0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4300: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4310: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c  secure_delete fl
4320: 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ag.  The second 
4330: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
4340: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
4350: 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67   ** flag setting
4360: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65   and reports the
4370: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f   new value..  */
4380: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4390: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b  SECURE_DELETE: {
43a0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
43b0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
43c0: 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20  int b = -1;.    
43d0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
43e0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
43f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
4400: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 52  lite3_stricmp(zR
4410: 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d 30  ight, "fast")==0
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   ){.        b = 
4430: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
4440: 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69          b = sqli
4450: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
4460: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
4470: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4480: 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e  pId2->n==0 && b>
4490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
44a0: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
44b0: 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
44c0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
44d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
44e0: 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b  eDelete(db->aDb[
44f0: 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20  ii].pBt, b);.   
4500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
4510: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
4520: 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c  ecureDelete(pBt,
4530: 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53   b);.    returnS
4540: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a  ingleInt(v, b);.
4550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4560: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
4580: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  age_count.  **  
4590: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
45a0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
45b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
45c0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
45d0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
45e0: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
45f0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
4600: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4610: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
4620: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
4630: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
4640: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
4650: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
4660: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
4670: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4680: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
4690: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
46a0: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
46b0: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
46c0: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
46d0: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
46e0: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
46f0: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
4700: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
4710: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
4720: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
4730: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
4740: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4750: 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a  .]page_count.  *
4760: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
4770: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
4780: 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
4790: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
47a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
47b0: 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  _PAGE_COUNT: {. 
47c0: 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20     int iReg;.   
47d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
47e0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
47f0: 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20   iDb);.    iReg 
4800: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4810: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4820: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
4830: 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  ])=='p' ){.     
4840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4850: 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75  p2(v, OP_Pagecou
4860: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a  nt, iDb, iReg);.
4870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4890: 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e  p3(v, OP_MaxPgcn
48a0: 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20  t, iDb, iReg, . 
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
48d0: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
48e0: 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20  oi(zRight)));.  
48f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
4900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4910: 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c  ResultRow, iReg,
4920: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
4930: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4940: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4950: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
4960: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4970: 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  a.]locking_mode 
4980: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
4990: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
49a0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
49b0: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
49c0: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
49d0: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
49e0: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
49f0: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
4a00: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
4a10: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
4a20: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4a30: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
4a40: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
4a50: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
4a60: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
4a70: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
4a80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
4a90: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
4aa0: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4ab0: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4ac0: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4ad0: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4ae0: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4af0: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4b00: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4b10: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4b40: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
4b50: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
4b60: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
4b70: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
4b80: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
4b90: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
4ba0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4bb0: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4bc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4bd0: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4be0: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4bf0: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4c00: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4c10: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4c20: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4c30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4c40: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
4c50: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
4c60: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
4c70: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
4c80: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
4c90: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
4ca0: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4cb0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4cc0: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4cd0: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4ce0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4cf0: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4d00: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4d10: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4d20: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4d30: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4d40: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
4d50: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
4d60: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
4d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d80: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
4d90: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
4da0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4db0: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4dc0: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4dd0: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4de0: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4df0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4e00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4e10: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4e20: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4e30: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4e40: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4e80: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4e90: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4ea0: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4eb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4ec0: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4ed0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4ee0: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4ef0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4f00: 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74  ngleText(v, zRet
4f10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4f20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4f30: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f40: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20  urnal_mode.  ** 
4f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4f60: 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a  ]journal_mode =.
4f70: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
4f80: 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74            (delet
4f90: 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72  e|persist|off|tr
4fa0: 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61  uncate|memory|wa
4fb0: 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61  l|off).  */.  ca
4fc0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
4fd0: 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69  AL_MODE: {.    i
4fe0: 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt eMode;       
4ff0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
5000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
5010: 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  _XXX symbols */.
5020: 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
5030: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5040: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66  unter */..    if
5050: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
5060: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
5070: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
5080: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
5090: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
50a0: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
50b0: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
50c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
50d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
50e0: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
50f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5100: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
5110: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5120: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
5130: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
5140: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
5150: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
5160: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
5170: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
5180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5190: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
51a0: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
51b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
51c0: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
51d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
51e0: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
51f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
5200: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
5210: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
5220: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
5230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
5240: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
5250: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
5260: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
5270: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
5280: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 26 20 28  NALMODE_OFF && (
5290: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
52a0: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 21 3d 30  TE_Defensive)!=0
52b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
52c0: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6a 6f 75 72  o not allow jour
52d0: 6e 61 6c 2d 6d 6f 64 65 20 22 4f 46 46 22 20 69  nal-mode "OFF" i
52e0: 6e 20 64 65 66 65 6e 73 69 76 65 20 73 69 6e 63  n defensive sinc
52f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
5300: 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65         ** can be
5310: 63 6f 6d 65 20 63 6f 72 72 75 70 74 65 64 20 75  come corrupted u
5320: 73 69 6e 67 20 6f 72 64 69 6e 61 72 79 20 53 51  sing ordinary SQ
5330: 4c 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  L when the journ
5340: 61 6c 20 69 73 20 6f 66 66 20 2a 2f 0a 20 20 20  al is off */.   
5350: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
5360: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
5370: 55 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UERY;.      }.  
5380: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64    }.    if( eMod
5390: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
53a0: 4d 4f 44 45 5f 51 55 45 52 59 20 26 26 20 70 49  MODE_QUERY && pI
53b0: 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  d2->n==0 ){.    
53c0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52    /* Convert "PR
53d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
53e0: 65 22 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20  e" into "PRAGMA 
53f0: 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  main.journal_mod
5400: 65 22 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20  e" */.      iDb 
5410: 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d  = 0;.      pId2-
5420: 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  >n = 1;.    }.  
5430: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
5440: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
5450: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
5460: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
5470: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
5480: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
5490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
54a0: 73 42 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20  sBtree(v, ii);. 
54b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
54c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
54d0: 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20  ournalMode, ii, 
54e0: 31 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  1, eMode);.     
54f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5510: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5520: 31 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b  1, 1);.    break
5530: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
5540: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5550: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5560: 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d  imit.  **  PRAGM
5570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
5580: 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a  al_size_limit=N.
5590: 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72    **.  ** Get or
55a0: 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69   set the size li
55b0: 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  mit on rollback 
55c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20  journal files.. 
55d0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
55e0: 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  yp_JOURNAL_SIZE_
55f0: 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67  LIMIT: {.    Pag
5600: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
5610: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
5620: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36  Db->pBt);.    i6
5630: 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20  4 iLimit = -2;. 
5640: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
5650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
5660: 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
5670: 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20  ht, &iLimit);.  
5680: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d      if( iLimit<-
5690: 31 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  1 ) iLimit = -1;
56a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69  .    }.    iLimi
56b0: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
56c0: 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
56d0: 28 70 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29  (pPager, iLimit)
56e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
56f0: 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29  leInt(v, iLimit)
5700: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
5710: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
5720: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5730: 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  AGMAS */..  /*. 
5740: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5750: 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ema.]auto_vacuum
5760: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5770: 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75  chema.]auto_vacu
5780: 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47  um=N.  **.  ** G
5790: 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 76 61  et or set the va
57a0: 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
57b0: 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  ase 'auto-vacuum
57c0: 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a  ' parameter..  *
57d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f  * The value is o
57e0: 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31  ne of:  0 NONE 1
57f0: 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e   FULL 2 INCREMEN
5800: 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  TAL.  */.#ifndef
5810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5820: 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50  OVACUUM.  case P
5830: 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55  ragTyp_AUTO_VACU
5840: 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  UM: {.    Btree 
5850: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
5860: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
5870: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  !=0 );.    if( !
5880: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
5890: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
58a0: 76 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  v, sqlite3BtreeG
58b0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74  etAutoVacuum(pBt
58c0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
58d0: 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d       int eAuto =
58e0: 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a   getAutoVacuum(z
58f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
5900: 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26  sert( eAuto>=0 &
5910: 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20  & eAuto<=2 );.  
5920: 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f      db->nextAuto
5930: 76 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b  vac = (u8)eAuto;
5940: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53  .      /* Call S
5950: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74  etAutoVacuum() t
5960: 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65  o set initialize
5970: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75   the internal au
5980: 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  to and.      ** 
5990: 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67  incr-vacuum flag
59a0: 73 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  s. This is requi
59b0: 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
59c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
59d0: 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65    ** creates the
59e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
59f0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
5a00: 74 68 61 74 20 69 74 20 69 73 20 63 72 65 61 74  that it is creat
5a10: 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61  ed.      ** as a
5a20: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  n auto-vacuum ca
5a30: 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20  pable db..      
5a40: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
5a50: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
5a60: 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75  oVacuum(pBt, eAu
5a70: 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  to);.      if( r
5a80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5a90: 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75  (eAuto==1 || eAu
5aa0: 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20  to==2) ){.      
5ab0: 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e    /* When settin
5ac0: 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75  g the auto_vacuu
5ad0: 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72  m mode to either
5ae0: 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20   "full" or .    
5af0: 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e      ** "incremen
5b00: 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20  tal", write the 
5b10: 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d  value of meta[6]
5b20: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5b30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
5b40: 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
5b50: 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65   to meta[6], che
5b60: 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20  ck that meta[3] 
5b70: 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20 20 20  indicates.      
5b80: 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
5b90: 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f  eally is an auto
5ba0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
5bb0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
5bc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61    */.        sta
5bd0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
5be0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
5bf0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20  LINENO(2);.     
5c00: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5c10: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65  VdbeOpList setMe
5c20: 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ta6[] = {.      
5c30: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
5c40: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20  tion,    0,     
5c50: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
5c60: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
5c70: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   0 */.          
5c80: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
5c90: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
5ca0: 31 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  1,         BTREE
5cb0: 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41  _LARGEST_ROOT_PA
5cc0: 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b  GE},.          {
5cd0: 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20   OP_If,         
5ce0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 30      1,         0
5cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d00: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
5d10: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5d20: 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20  Halt,           
5d30: 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62  SQLITE_OK, OE_Ab
5d40: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d  ort,          0}
5d50: 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
5d60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
5d70: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
5d80: 20 20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43         BTREE_INC
5d90: 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20  R_VACUUM, 0},   
5da0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20   /* 4 */.       
5db0: 20 7d 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65   };.        Vdbe
5dc0: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20  Op *aOp;.       
5dd0: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
5de0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5df0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
5e00: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
5e10: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
5e20: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  d(v, ArraySize(s
5e30: 65 74 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20  etMeta6));.     
5e40: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
5e50: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
5e60: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65   ArraySize(setMe
5e70: 74 61 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20  ta6), setMeta6, 
5e80: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iLn);.        if
5e90: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
5ea0: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
5eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5ec0: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
5ed0: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31  b;.        aOp[1
5ee0: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
5ef0: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20      aOp[2].p2 = 
5f00: 69 41 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20  iAddr+4;.       
5f10: 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62   aOp[4].p1 = iDb
5f20: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d  ;.        aOp[4]
5f30: 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b  .p3 = eAuto - 1;
5f40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f50: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5f60: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
5f70: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
5f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
5f90: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5fa0: 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74  chema.]increment
5fb0: 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a  al_vacuum(N).  *
5fc0: 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70  *.  ** Do N step
5fd0: 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s of incremental
5fe0: 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20   vacuuming on a 
5ff0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
6000: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6010: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
6020: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43  case PragTyp_INC
6030: 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a  REMENTAL_VACUUM:
6040: 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69   {.    int iLimi
6050: 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28  t, addr;.    if(
6060: 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73   zRight==0 || !s
6070: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
6080: 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20  Right, &iLimit) 
6090: 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  || iLimit<=0 ){.
60a0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30        iLimit = 0
60b0: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d  x7fffffff;.    }
60c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
60d0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
60e0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
60f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6100: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6110: 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29  eger, iLimit, 1)
6120: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
6130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6140: 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c  , OP_IncrVacuum,
6150: 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72   iDb); VdbeCover
6160: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
6170: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6180: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
6190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
61a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
61b0: 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20  ddImm, 1, -1);. 
61c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
61d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
61e0: 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65  , 1, addr); Vdbe
61f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6200: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6210: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
6220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
6230: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
6240: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
6250: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
6260: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
6270: 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  a.]cache_size.  
6280: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6290: 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e  ma.]cache_size=N
62a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
62b0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
62c0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
62d0: 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20  cal setting for 
62e0: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
62f0: 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65  che size. The se
6300: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
6310: 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61  he local.  ** pa
6320: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
6330: 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f  lue.  If N is po
6340: 73 69 74 69 76 65 20 74 68 65 6e 20 74 68 61 74  sitive then that
6350: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d   is the.  ** num
6360: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
6370: 74 68 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e  the cache.  If N
6380: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
6390: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  en the.  ** numb
63a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 61  er of pages is a
63b0: 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61 74 20  djusted so that 
63c0: 74 68 65 20 63 61 63 68 65 20 75 73 65 73 20 2d  the cache uses -
63d0: 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a  N kibibytes.  **
63e0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f   of memory..  */
63f0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
6400: 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20  CACHE_SIZE: {.  
6410: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6420: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
6430: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
6440: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
6450: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
6460: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
6470: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6480: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  size);.    }else
6490: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
64a0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
64b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44  Right);.      pD
64c0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
64d0: 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  e_size = size;. 
64e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
64f0: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44  eSetCacheSize(pD
6500: 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63  b->pBt, pDb->pSc
6510: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
6520: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
6530: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6540: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6550: 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a  ma.]cache_spill.
6560: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
6570: 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e  he_spill=BOOLEAN
6580: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6590: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69  chema.]cache_spi
65a0: 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ll=N.  **.  ** T
65b0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
65c0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
65d0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
65e0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
65f0: 65 20 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69  e cache spill si
6600: 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66  ze. The second f
6610: 6f 72 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20  orm turns cache 
6620: 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72  spill on.  ** or
6630: 20 6f 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e   off.  When turn
6640: 6e 69 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c  ning cache spill
6650: 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73   on, the size is
6660: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
6670: 20 63 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73   current cache_s
6680: 69 7a 65 2e 20 20 54 68 65 20 74 68 69 72 64 20  ize.  The third 
6690: 66 6f 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c  form sets a spil
66a0: 6c 20 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a  l size that.  **
66b0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
66c0: 74 20 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65  t form the cache
66d0: 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e   size..  ** If N
66e0: 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65   is positive the
66f0: 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  n that is the.  
6700: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6710: 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
6720: 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69    If N is negati
6730: 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ve, then the.  *
6740: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
6750: 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f  s is adjusted so
6760: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
6770: 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65  uses -N kibibyte
6780: 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  s.  ** of memory
6790: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
67a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  he number of cac
67b0: 68 65 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69  he_spill pages i
67c0: 73 20 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20  s less then the 
67d0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
67e0: 61 63 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c  ache_size pages,
67f0: 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63   no spilling occ
6800: 75 72 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61  urs until the pa
6810: 67 65 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73  ge count exceeds
6820: 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
6830: 20 6f 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70   of cache_size p
6840: 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ages..  **.  ** 
6850: 54 68 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  The cache_spill=
6860: 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20  BOOLEAN setting 
6870: 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61  applies to all a
6880: 74 74 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c  ttached schemas,
6890: 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74  .  ** not just t
68a0: 68 65 20 73 63 68 65 6d 61 20 73 70 65 63 69 66  he schema specif
68b0: 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ied..  */.  case
68c0: 20 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53   PragTyp_CACHE_S
68d0: 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65  PILL: {.    asse
68e0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
68f0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6900: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6910: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
6920: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6930: 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28  nt(v,.         (
6940: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6950: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d  TE_CacheSpill)==
6960: 30 20 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20  0 ? 0 : .       
6970: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6980: 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44  eSetSpillSize(pD
6990: 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20  b->pBt,0));.    
69a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
69b0: 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20   size = 1;.     
69c0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
69d0: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69  nt32(zRight, &si
69e0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ze) ){.        s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70  qlite3BtreeSetSp
6a00: 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74  illSize(pDb->pBt
6a10: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  , size);.      }
6a20: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6a30: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
6a40: 67 68 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b  ght, size!=0) ){
6a50: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
6a60: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63  gs |= SQLITE_Cac
6a70: 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d  heSpill;.      }
6a80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
6a90: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34  ->flags &= ~(u64
6aa0: 29 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69  )SQLITE_CacheSpi
6ab0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
6ac0: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
6ad0: 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  gs(db);.    }.  
6ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6af0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
6b00: 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69  [schema.]mmap_si
6b10: 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ze(N).  **.  ** 
6b20: 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70  Used to set mapp
6b30: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20  ing size limit. 
6b40: 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  The mapping size
6b50: 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75   limit is.  ** u
6b60: 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  sed to limit the
6b70: 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20   aggregate size 
6b80: 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61  of all memory ma
6b90: 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20  pped regions of 
6ba0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
6bb0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20  e file. If this 
6bc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
6bd0: 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d   to zero, then m
6be0: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20  emory mapping.  
6bf0: 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61  ** is not used a
6c00: 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20  t all.  If N is 
6c10: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
6c20: 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72  he default memor
6c30: 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74  y map.  ** limit
6c40: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73   determined by s
6c50: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
6c60: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
6c70: 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20  _SIZE) is set.. 
6c80: 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65   ** The paramete
6c90: 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20  r N is measured 
6ca0: 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20  in bytes..  **. 
6cb0: 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69   ** This value i
6cc0: 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65  s advisory.  The
6cd0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20   underlying VFS 
6ce0: 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72  is free to memor
6cf0: 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69  y map.  ** as li
6d00: 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20  ttle or as much 
6d10: 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78  as it wants.  Ex
6d20: 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65  cept, if N is se
6d30: 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a  t to 0 then the.
6d40: 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72    ** upper layer
6d50: 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76  s will never inv
6d60: 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69  oke the xFetch i
6d70: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65  nterfaces to the
6d80: 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   VFS..  */.  cas
6d90: 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53  e PragTyp_MMAP_S
6da0: 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  IZE: {.    sqlit
6db0: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66  e3_int64 sz;.#if
6dc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6dd0: 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65  _SIZE>0.    asse
6de0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6df0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6e00: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6e10: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
6e20: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
6e30: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
6e40: 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a  oI64(zRight, &sz
6e50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c  );.      if( sz<
6e60: 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33  0 ) sz = sqlite3
6e70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
6e80: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  map;.      if( p
6e90: 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e  Id2->n==0 ) db->
6ea0: 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20  szMmap = sz;.   
6eb0: 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44     for(ii=db->nD
6ec0: 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d  b-1; ii>=0; ii--
6ed0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  ){.        if( d
6ee0: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26  b->aDb[ii].pBt &
6ef0: 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49  & (ii==iDb || pI
6f00: 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  d2->n==0) ){.   
6f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6f20: 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
6f30: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
6f40: 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz);.        }.
6f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f60: 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72    sz = -1;.    r
6f70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
6f80: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
6f90: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
6fa0: 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
6fb0: 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30  #else.    sz = 0
6fc0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
6fd0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E_OK;.#endif.   
6fe0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6ff0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
7000: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
7010: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  z);.    }else if
7020: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc!=SQLITE_NOT
7030: 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70  FOUND ){.      p
7040: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7050: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
7060: 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = rc;.    }.    
7070: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
7080: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
7090: 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20  emp_store.  **  
70a0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
70b0: 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22  re = "default"|"
70c0: 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20  memory"|"file". 
70d0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
70e0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
70f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
7100: 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20  mp_store flag.  
7110: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7120: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
7130: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
7140: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
7150: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66  file and the def
7160: 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20  ault.  ** value 
7170: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
7180: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
7190: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
71a0: 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pened..  **.  **
71b0: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
71c0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
71d0: 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c  e library compil
71e0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74  e-time options t
71f0: 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20  o.  ** override 
7200: 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a  this setting.  *
7210: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7220: 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20  _TEMP_STORE: {. 
7230: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7240: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
7250: 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74  ngleInt(v, db->t
7260: 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20  emp_store);.    
7270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
7280: 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ngeTempStorage(p
7290: 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a  Parse, zRight);.
72a0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
72b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
72c0: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
72d0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20  ore_directory.  
72e0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
72f0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7300: 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79   = ""|"directory
7310: 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _name".  **.  **
7320: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7330: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7340: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
7350: 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e  _directory flag.
7360: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7370: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
7380: 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74   specific direct
7390: 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66  ory to be used f
73a0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
73b0: 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67  es..  ** Setting
73c0: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
73d0: 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65  g reverts to the
73e0: 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61   default tempora
73f0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61  ry directory sea
7400: 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d  rch..  ** If tem
7410: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
7420: 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
7430: 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70  n invalidateTemp
7440: 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  Storage..  **.  
7450: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
7460: 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52  p_TEMP_STORE_DIR
7470: 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66  ECTORY: {.    if
7480: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7490: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
74a0: 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74  ext(v, sqlite3_t
74b0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
74c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
74d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
74e0: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
74f0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7500: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7510: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7520: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
7530: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
7540: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
7550: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
7560: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7570: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
7580: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7590: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
75a0: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
75b0: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
75c0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
75d0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
75e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
75f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45     if( SQLITE_TE
7600: 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20  MP_STORE==0.    
7610: 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45     || (SQLITE_TE
7620: 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64  MP_STORE==1 && d
7630: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31  b->temp_store<=1
7640: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c  ).       || (SQL
7650: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
7660: 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74  2 && db->temp_st
7670: 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b  ore==1).      ){
7680: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
7690: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ateTempStorage(p
76a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
76b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
76c0: 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ee(sqlite3_temp_
76d0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
76e0: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
76f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7700: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7710: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7720: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7730: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7750: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
7760: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7770: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7780: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
77a0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
77b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
77c0: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
77d0: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20  irectory.  **   
77e0: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
77f0: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22  e_directory = ""
7800: 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65  |"directory_name
7810: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
7820: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
7830: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
7840: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
7850: 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61  ctory flag.  Cha
7860: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
7870: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7880: 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74  ific directory t
7890: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
78a0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61  tabase files tha
78b0: 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63  t.  ** were spec
78c0: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
78d0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
78e0: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
78f0: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
7900: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65  s.  ** to the de
7910: 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64  fault database d
7920: 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20  irectory, which 
7930: 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
7940: 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  es specified wit
7950: 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76  h.  ** a relativ
7960: 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62  e path will prob
7970: 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e  ably be based on
7980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72   the current dir
7990: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20  ectory for the. 
79a0: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61   ** process.  Da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63  tabase file spec
79c0: 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62  ified with an ab
79d0: 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20  solute path are 
79e0: 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a  not impacted.  *
79f0: 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e  * by this settin
7a00: 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  g, regardless of
7a10: 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a   its value..  **
7a20: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7a30: 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f  gTyp_DATA_STORE_
7a40: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7a50: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7a60: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7a70: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7a80: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7a90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7aa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ab0: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
7ac0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7ad0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
7ae0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7af0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
7b00: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
7b10: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7b20: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7b30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7b40: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7b60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7b70: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7b80: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7ba0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7bd0: 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  ee(sqlite3_data_
7be0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7bf0: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7c00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7c10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7c20: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7c30: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7c40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7c50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7c60: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
7c70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7c80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7c90: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7ca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
7cb0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
7cc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
7cd0: 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  STYLE.  /*.  ** 
7ce0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7cf0: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7d00: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
7d10: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72  [schema.]lock_pr
7d20: 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74  oxy_file = ":aut
7d30: 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70  o:"|"lock_file_p
7d40: 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ath".  **.  ** R
7d50: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7d60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
7d70: 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c  ck_proxy_file fl
7d80: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7d90: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7da0: 73 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c  s a specific fil
7db0: 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  e to be used for
7dc0: 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
7dd0: 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a   locks..  **.  *
7de0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7df0: 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45  _LOCK_PROXY_FILE
7e00: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
7e10: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ght ){.      Pag
7e20: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7e30: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7e40: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7e50: 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65  char *proxy_file
7e60: 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _path = NULL;.  
7e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7e80: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7e90: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7ea0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7eb0: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
7ec0: 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
7ed0: 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
7ee0: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68  &proxy_file_path
7f10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
7f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f  ingleText(v, pro
7f30: 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20  xy_file_path);. 
7f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7f60: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7f70: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7f80: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7f90: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7fa0: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7fb0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
7fc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
7fd0: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7fe0: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
7ff0: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
8000: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
8010: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
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: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
8050: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
8060: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
8070: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
8080: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
8090: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
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: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a   NULL);.      }.
80d0: 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53        if( res!=S
80e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
80f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8100: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69  Msg(pParse, "fai
8110: 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20  led to set lock 
8120: 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20  proxy file");.  
8130: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
8140: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  a_out;.      }. 
8150: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8160: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
8180: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20  ING_STYLE */    
8190: 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    .    .  /*.  *
81a0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
81b0: 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ma.]synchronous.
81c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
81d0: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
81e0: 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c  us=OFF|ON|NORMAL
81f0: 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a  |FULL|EXTRA.  **
8200: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
8210: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
8220: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68  lue of the synch
8230: 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68  ronous flag.  Ch
8240: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
8250: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
8260: 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
8270: 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
8280: 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  le and the.  ** 
8290: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
82a0: 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
82b0: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
82c0: 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a   database is.  *
82d0: 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  * opened..  */. 
82e0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59   case PragTyp_SY
82f0: 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20  NCHRONOUS: {.   
8300: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
8310: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
8320: 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61  leInt(v, pDb->sa
8330: 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20  fety_level-1);. 
8340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8350: 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
8360: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mit ){.        s
8370: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8380: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
8390: 20 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65      "Safety leve
83a0: 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  l may not be cha
83b0: 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72  nged inside a tr
83c0: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
83d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62     }else if( iDb
83e0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=1 ){.        i
83f0: 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74  nt iLevel = (get
8400: 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67  SafetyLevel(zRig
8410: 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47  ht,0,1)+1) & PAG
8420: 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
8430: 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ASK;.        if(
8440: 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65   iLevel==0 ) iLe
8450: 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  vel = 1;.       
8460: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
8470: 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20  el = iLevel;.   
8480: 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53       pDb->bSyncS
8490: 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
84a0: 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73  setAllPagerFlags
84b0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
84c0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
84d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
84e0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
84f0: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
8500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8510: 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61  LAG_PRAGMAS.  ca
8520: 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a  se PragTyp_FLAG:
8530: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
8540: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65  t==0 ){.      se
8550: 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c  tPragmaResultCol
8560: 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61  umnNames(v, pPra
8570: 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gma);.      retu
8580: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28  rnSingleInt(v, (
8590: 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61  db->flags & pPra
85a0: 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b  gma->iArg)!=0 );
85b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
85c0: 20 20 75 36 34 20 6d 61 73 6b 20 3d 20 70 50 72    u64 mask = pPr
85d0: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f  agma->iArg;    /
85e0: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
85f0: 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20  o set or clear. 
8600: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  */.      if( db-
8610: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
8620: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
8630: 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74  eign key support
8640: 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62   may not be enab
8650: 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20  led or disabled 
8660: 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20  while not.      
8670: 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d    ** in auto-com
8680: 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  mit mode.  */.  
8690: 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28        mask &= ~(
86a0: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
86b0: 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ys);.      }.#if
86c0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
86d0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
86e0: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
86f0: 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f  uthLevel==UAUTH_
8700: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
8710: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
8720: 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20  non-admin users 
8730: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63  to modify the sc
8740: 68 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79  hema arbitrarily
8750: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b   */.        mask
8760: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69   &= ~(SQLITE_Wri
8770: 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  teSchema);.     
8780: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
8790: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42   if( sqlite3GetB
87a0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
87b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
87c0: 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  >flags |= mask;.
87d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
87e0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
87f0: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = ~mask;.       
8800: 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54   if( mask==SQLIT
8810: 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d  E_DeferFKs ) db-
8820: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8830: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  s = 0;.      }..
8840: 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66        /* Many of
8850: 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61   the flag-pragma
8860: 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64  s modify the cod
8870: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
8880: 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a  he SQL .      **
8890: 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63   compiler (eg. c
88a0: 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53  ount_changes). S
88b0: 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  o add an opcode 
88c0: 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20  to expire all.  
88d0: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
88e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
88f0: 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  fter modifying a
8900: 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20   pragma value.. 
8910: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
8920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8930: 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
8940: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
8950: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
8960: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8970: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8980: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
8990: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
89a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
89b0: 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  A_PRAGMAS.  /*. 
89c0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62   **   PRAGMA tab
89d0: 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29  le_info(<table>)
89e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
89f0: 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66  n a single row f
8a00: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
8a10: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
8a20: 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  e. The columns o
8a30: 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72  f.  ** the retur
8a40: 6e 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65  ned data set are
8a50: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a  :.  **.  ** cid:
8a60: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69          Column i
8a70: 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d  d (numbered from
8a80: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
8a90: 73 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20  starting at 0). 
8aa0: 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20   ** name:       
8ab0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a  Column name.  **
8ac0: 20 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c   type:       Col
8ad0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  umn declaration 
8ae0: 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75  type..  ** notnu
8af0: 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27  ll:    True if '
8b00: 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72  NOT NULL' is par
8b10: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  t of column decl
8b20: 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c  aration.  ** dfl
8b30: 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66  t_value: The def
8b40: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8b50: 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e  he column, if an
8b60: 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20 20 20  y..  ** pk:     
8b70: 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66 6f 72      Non-zero for
8b80: 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f   PK fields..  */
8b90: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
8ba0: 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66 28 20  TABLE_INFO: if( 
8bb0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 54 61  zRight ){.    Ta
8bc0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
8bd0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
8be0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
8bf0: 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c 20 7a   LOCATE_NOERR, z
8c00: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
8c10: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
8c20: 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20     int iTabDb = 
8c30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
8c40: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
8c50: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69  Schema);.      i
8c60: 6e 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69  nt i, k;.      i
8c70: 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a  nt nHidden = 0;.
8c80: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
8c90: 6f 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  ol;.      Index 
8ca0: 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
8cb0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
8cc0: 61 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ab);.      pPars
8cd0: 65 2d 3e 6e 4d 65 6d 20 3d 20 37 3b 0a 20 20 20  e->nMem = 7;.   
8ce0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
8cf0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
8d00: 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20  e, iTabDb);.    
8d10: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
8d20: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
8d30: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  se, pTab);.     
8d40: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
8d50: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
8d60: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
8d70: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
8d80: 6e 74 20 69 73 48 69 64 64 65 6e 20 3d 20 49 73  nt isHidden = Is
8d90: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8da0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
8db0: 69 73 48 69 64 64 65 6e 20 26 26 20 70 50 72 61  isHidden && pPra
8dc0: 67 6d 61 2d 3e 69 41 72 67 3d 3d 30 20 29 7b 0a  gma->iArg==0 ){.
8dd0: 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65            nHidde
8de0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
8df0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8e00: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8e10: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
8e20: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
8e30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8e40: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
8e50: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d   }else if( pPk==
8e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b  0 ){.          k
8e70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8e80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
8e90: 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d  or(k=1; k<=pTab-
8ea0: 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69  >nCol && pPk->ai
8eb0: 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20  Column[k-1]!=i; 
8ec0: 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d  k++){}.        }
8ed0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8ee0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20   pCol->pDflt==0 
8ef0: 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e  || pCol->pDflt->
8f00: 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20  op==TK_SPAN );. 
8f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8f20: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
8f30: 2c 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20  , pPragma->iArg 
8f40: 3f 20 22 69 73 73 69 73 69 69 22 20 3a 20 22 69  ? "issisii" : "i
8f50: 73 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20  ssisi",.        
8f60: 20 20 20 20 20 20 20 69 2d 6e 48 69 64 64 65 6e         i-nHidden
8f70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8f80: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pCol->zName,.  
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8fa0: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
8fb0: 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20 20 20 20  Col,""),.       
8fc0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 6e 6f          pCol->no
8fd0: 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c 0a 20  tNull ? 1 : 0,. 
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
8ff0: 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70 43 6f 6c  ol->pDflt ? pCol
9000: 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pDflt->u.zToke
9010: 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n : 0,.         
9020: 20 20 20 20 20 20 6b 2c 0a 20 20 20 20 20 20 20        k,.       
9030: 20 20 20 20 20 20 20 20 69 73 48 69 64 64 65 6e          isHidden
9040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9050: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
9060: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9070: 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  UG.  case PragTy
9080: 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20 49  p_STATS: {.    I
9090: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
90a0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20  HashElem *i;.   
90b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
90c0: 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  5;.    sqlite3Co
90d0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
90e0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
90f0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9100: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
9110: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
9120: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9130: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20 54  ext(i)){.      T
9140: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
9150: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9170: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9180: 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20 20 20   "ssiii",.      
9190: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
91a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a  ,.           0,.
91b0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
91c0: 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20 20  >szTabRow,.     
91d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
91e0: 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20 20 20  LogEst,.        
91f0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
9200: 73 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  s);.      for(pI
9210: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
9220: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9230: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9250: 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73 69  tiLoad(v, 2, "si
9260: 69 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  iiX",.          
9270: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pIdx->zName,.  
9280: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 73           pIdx->s
9290: 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20 20  zIdxRow,.       
92a0: 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c      pIdx->aiRowL
92b0: 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20  ogEst[0],.      
92c0: 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53 74       pIdx->hasSt
92d0: 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  at1);.        sq
92e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
92f0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9300: 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 5);.      }.
9310: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9320: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  k;.#endif..  cas
9330: 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f  e PragTyp_INDEX_
9340: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
9350: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9360: 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
9370: 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d  pTab;.    pIdx =
9380: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
9390: 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  x(db, zRight, zD
93a0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  b);.    if( pIdx
93b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
93c0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  If there is no i
93d0: 6e 64 65 78 20 6e 61 6d 65 64 20 7a 52 69 67 68  ndex named zRigh
93e0: 74 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  t, check to see 
93f0: 69 66 20 74 68 65 72 65 20 69 73 20 61 0a 20 20  if there is a.  
9400: 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52      ** WITHOUT R
9410: 4f 57 49 44 20 74 61 62 6c 65 20 6e 61 6d 65 64  OWID table named
9420: 20 7a 52 69 67 68 74 2c 20 61 6e 64 20 69 66 20   zRight, and if 
9430: 74 68 65 72 65 20 69 73 2c 20 73 68 6f 77 20 74  there is, show t
9440: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 72 75  he.      ** stru
9450: 63 74 75 72 65 20 6f 66 20 74 68 65 20 50 52 49  cture of the PRI
9460: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66  MARY KEY index f
9470: 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 2a  or that table. *
9480: 2f 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  /.      pTab = s
9490: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
94a0: 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45  e(pParse, LOCATE
94b0: 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20  _NOERR, zRight, 
94c0: 7a 44 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  zDb);.      if( 
94d0: 70 54 61 62 20 26 26 20 21 48 61 73 52 6f 77 69  pTab && !HasRowi
94e0: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
94f0: 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65     pIdx = sqlite
9500: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
9510: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  (pTab);.      }.
9520: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
9530: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
9540: 69 49 64 78 44 62 20 3d 20 73 71 6c 69 74 65 33  iIdxDb = sqlite3
9550: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
9560: 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29  , pIdx->pSchema)
9570: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
9580: 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20       int mx;.   
9590: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
95a0: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
95b0: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
95c0: 78 69 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72  xinfo (newer ver
95d0: 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72  sion with more r
95e0: 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29  ows and columns)
95f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d   */.        mx =
9600: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
9610: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9620: 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20  nMem = 6;.      
9630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
9640: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69  * PRAGMA index_i
9650: 6e 66 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73  nfo (legacy vers
9660: 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion) */.        
9670: 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mx = pIdx->nKeyC
9680: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ol;.        pPar
9690: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20  se->nMem = 3;.  
96a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
96b0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
96c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
96d0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
96e0: 50 61 72 73 65 2c 20 69 49 64 78 44 62 29 3b 0a  Parse, iIdxDb);.
96f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9700: 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61  arse->nMem<=pPra
9710: 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20  gma->nPragCName 
9720: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
9730: 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<mx; i++){.  
9740: 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d        i16 cnum =
9750: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9760: 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
9770: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9780: 28 76 2c 20 31 2c 20 22 69 69 73 58 22 2c 20 69  (v, 1, "iisX", i
9790: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
97c0: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
97d0: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
97e0: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
97f0: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9810: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
9820: 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iX",.           
9830: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
9840: 72 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  r[i],.          
9850: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69    pIdx->azColl[i
9860: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ],.            i
9870: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  <pIdx->nKeyCol);
9880: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
98a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
98b0: 74 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d  tRow, 1, pParse-
98c0: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  >nMem);.      }.
98d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
98e0: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
98f0: 79 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69  yp_INDEX_LIST: i
9900: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9910: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9920: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9930: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54     int i;.    pT
9940: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
9950: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
9960: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
9970: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e  pTab ){.      in
9980: 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74  t iTabDb = sqlit
9990: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
99a0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
99b0: 61 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  a);.      pParse
99c0: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
99d0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
99e0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
99f0: 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20  , iTabDb);.     
9a00: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9a10: 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64  pIndex, i=0; pId
9a20: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9a30: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
9a40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
9a50: 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63  zOrigin[] = { "c
9a60: 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a  ", "u", "pk" };.
9a70: 20 20 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 69 73 69 22 2c 0a 20 20 20 20  1, "isisi",.    
9aa0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9ab0: 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65       pIdx->zName
9ac0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73 55  ,.           IsU
9ad0: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
9ae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f  ,.           azO
9af0: 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54  rigin[pIdx->idxT
9b00: 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ype],.          
9b10: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
9b20: 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20  here!=0);.      
9b30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9b40: 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61  eak;..  case Pra
9b50: 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c 49  gTyp_DATABASE_LI
9b60: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9b70: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9b80: 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28 69  m = 3;.    for(i
9b90: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
9ba0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
9bb0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
9bc0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9bd0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
9be0: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d  Db[i].zDbSName!=
9bf0: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
9c00: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9c10: 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20 20  v, 1, "iss",.   
9c20: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
9c30: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62    db->aDb[i].zDb
9c40: 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  SName,.         
9c50: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
9c60: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
9c70: 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a  i].pBt));.    }.
9c80: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
9c90: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4c  case PragTyp_COL
9ca0: 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20  LATION_LIST: {. 
9cb0: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
9cc0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
9cd0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9ce0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73  = 2;.    for(p=s
9cf0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9d00: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70  db->aCollSeq); p
9d10: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
9d20: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43 6f  xt(p)){.      Co
9d30: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
9d40: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
9d50: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
9d60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9d70: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
9d80: 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e  s", i++, pColl->
9d90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9da0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e  }.  break;..#ifn
9db0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9dc0: 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52  INTROSPECTION_PR
9dd0: 41 47 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61  AGMAS.  case Pra
9de0: 67 54 79 70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  gTyp_FUNCTION_LI
9df0: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9e00: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a  .    HashElem *j
9e10: 3b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  ;.    FuncDef *p
9e20: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9e30: 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
9e40: 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55  i=0; i<SQLITE_FU
9e50: 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29  NC_HASH_SZ; i++)
9e60: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71  {.      for(p=sq
9e70: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
9e80: 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70  tions.a[i]; p; p
9e90: 3d 70 2d 3e 75 2e 70 48 61 73 68 20 29 7b 0a 20  =p->u.pHash ){. 
9ea0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 75         if( p->fu
9eb0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
9ec0: 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 20 29  _FUNC_INTERNAL )
9ed0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9ee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9ef0: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9f00: 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29  i", p->zName, 1)
9f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9f20: 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65      for(j=sqlite
9f30: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9f40: 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69  Func); j; j=sqli
9f50: 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a  teHashNext(j)){.
9f60: 20 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63 44        p = (FuncD
9f70: 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  ef*)sqliteHashDa
9f80: 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(j);.      sql
9f90: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9fa0: 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d  d(v, 1, "si", p-
9fb0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9fc0: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9fd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9fe0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9ff0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
a000: 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20  MODULE_LIST: {. 
a010: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a     HashElem *j;.
a020: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
a030: 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
a040: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a050: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a  &db->aModule); j
a060: 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; j=sqliteHashNe
a070: 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f  xt(j)){.      Mo
a080: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
a090: 64 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  dule*)sqliteHash
a0a0: 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73  Data(j);.      s
a0b0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
a0c0: 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 70  oad(v, 1, "s", p
a0d0: 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Mod->zName);.   
a0e0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
a0f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a100: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a110: 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72  LE */..  case Pr
a120: 61 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53  agTyp_PRAGMA_LIS
a130: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  T: {.    int i;.
a140: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
a150: 72 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d 61  rraySize(aPragma
a160: 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Name); i++){.   
a170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
a180: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
a190: 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69  ", aPragmaName[i
a1a0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
a1b0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
a1c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e  dif /* SQLITE_IN
a1d0: 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47  TROSPECTION_PRAG
a1e0: 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  MAS */..#endif /
a1f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  * SQLITE_OMIT_SC
a200: 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  HEMA_PRAGMAS */.
a210: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a220: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
a230: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
a240: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54  FOREIGN_KEY_LIST
a250: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
a260: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20      FKey *pFK;. 
a270: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
a280: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
a290: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a2a0: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
a2b0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
a2c0: 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e      pFK = pTab->
a2d0: 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28  pFKey;.      if(
a2e0: 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20   pFK ){.        
a2f0: 69 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c  int iTabDb = sql
a300: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
a310: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
a320: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ema);.        in
a330: 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  t i = 0; .      
a340: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
a350: 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   8;.        sqli
a360: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a370: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62  ema(pParse, iTab
a380: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  Db);.        whi
a390: 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20  le(pFK){.       
a3a0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a3b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a3c0: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a3e0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
a3f0: 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73  (v, 1, "iissssss
a400: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a410: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
a420: 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20              j,. 
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20    pFK->zTo,.    
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a460: 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61  Tab->aCol[pFK->a
a470: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e  Col[j].iFrom].zN
a480: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a490: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f          pFK->aCo
a4a0: 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20  l[j].zCol,.     
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a4c0: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a4d0: 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f  ction[1]),  /* O
a4e0: 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20  N UPDATE */.    
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a500: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
a510: 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20  Action[0]),  /* 
a520: 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20  ON DELETE */.   
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20  "NONE");.       
a550: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
a560: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
a570: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
a580: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
a590: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a5a0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
a5b0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
a5c0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a5d0: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
a5e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a5f0: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
a600: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
a610: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
a620: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
a630: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
a640: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
a650: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
a660: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a670: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
a680: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
a690: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
a6a0: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
a6b0: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
a6c0: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
a6d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
a6e0: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
a6f0: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
a700: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a720: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
a730: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
a740: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
a750: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a760: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
a770: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
a780: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
a790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a7a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a7b0: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
a7c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
a7d0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
a7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a7f0: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
a800: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
a810: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
a840: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
a850: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
a860: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
a870: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
a880: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
a890: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
a8a0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
a8b0: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
a8c0: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
a8d0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
a8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a8f0: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
a900: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
a910: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
a920: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
a930: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
a940: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
a950: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
a960: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
a970: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a980: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
a990: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
a9a0: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
a9b0: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
a9c0: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
a9d0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
a9e0: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
a9f0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
aa00: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
aa10: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
aa20: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
aa30: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
aa40: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 6b 20 3d 20  ->nMem;.    k = 
aa50: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
aa60: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
aa70: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
aa80: 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b  .    while( k ){
aa90: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44  .      int iTabD
aaa0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  b;.      if( zRi
aab0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ght ){.        p
aac0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
aad0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
aae0: 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29   0, zRight, zDb)
aaf0: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ;.        k = 0;
ab00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ab10: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
ab20: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
ab30: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  ata(k);.        
ab40: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65  k = sqliteHashNe
ab50: 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xt(k);.      }. 
ab60: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
ab70: 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d   || pTab->pFKey=
ab80: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
ab90: 20 20 20 20 20 69 54 61 62 44 62 20 3d 20 73 71       iTabDb = sq
aba0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
abb0: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
abc0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
abd0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
abe0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61  hema(pParse, iTa
abf0: 62 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bDb);.      sqli
ac00: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
ac10: 72 73 65 2c 20 69 54 61 62 44 62 2c 20 70 54 61  rse, iTabDb, pTa
ac20: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
ac30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
ac40: 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72  if( pTab->nCol+r
ac50: 65 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d  egRow>pParse->nM
ac60: 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em ) pParse->nMe
ac70: 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b  m = pTab->nCol +
ac80: 20 72 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73   regRow;.      s
ac90: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
aca0: 70 50 61 72 73 65 2c 20 30 2c 20 69 54 61 62 44  pParse, 0, iTabD
acb0: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
acc0: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  Read);.      sql
acd0: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
ace0: 6e 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c  ng(v, regResult,
acf0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
ad00: 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46       for(i=1, pF
ad10: 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  K=pTab->pFKey; p
ad20: 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b  FK; i++, pFK=pFK
ad30: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
ad40: 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20        pParent = 
ad50: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
ad60: 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a  (db, pFK->zTo, z
ad70: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Db);.        if(
ad80: 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f   pParent==0 ) co
ad90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ada0: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
adb0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
adc0: 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ck(pParse, iTabD
add0: 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d  b, pParent->tnum
ade0: 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e  , 0, pParent->zN
adf0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ame);.        x 
ae00: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
ae10: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
ae20: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
ae30: 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
ae40: 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20  if( x==0 ){.    
ae50: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d        if( pIdx==
ae60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
ae70: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
ae80: 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 54 61  e(pParse, i, iTa
ae90: 62 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50  bDb, pParent, OP
aea0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
aeb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aec0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aed0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aee0: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49  _OpenRead, i, pI
aef0: 64 78 2d 3e 74 6e 75 6d 2c 20 69 54 61 62 44 62  dx->tnum, iTabDb
af00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
af10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
af20: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
af30: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
af40: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
af50: 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30  .          k = 0
af60: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
af70: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
af80: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
af90: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  t( pParse->nErr>
afa0: 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20  0 || pFK==0 );. 
afb0: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62       if( pFK ) b
afc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
afd0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29  pParse->nTab<i )
afe0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
aff0: 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  i;.      addrTop
b000: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b010: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
b020: 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  d, 0); VdbeCover
b030: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  age(v);.      fo
b040: 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d  r(i=1, pFK=pTab-
b050: 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b  >pFKey; pFK; i++
b060: 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74  , pFK=pFK->pNext
b070: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70  From){.        p
b080: 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
b090: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46  FindTable(db, pF
b0a0: 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20  K->zTo, zDb);.  
b0b0: 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
b0c0: 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d          aiCols =
b0d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
b0e0: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
b0f0: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
b100: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
b110: 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
b120: 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f  FK, &pIdx, &aiCo
b130: 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ls);.          a
b140: 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20  ssert( x==0 );. 
b150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b160: 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65   addrOk = sqlite
b170: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
b180: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20  Parse);..       
b190: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
b1a0: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63 68  e to read the ch
b1b0: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20 69  ild key values i
b1c0: 6e 74 6f 20 72 65 67 69 73 74 65 72 73 0a 20 20  nto registers.  
b1d0: 20 20 20 20 20 20 2a 2a 20 72 65 67 52 6f 77 2e        ** regRow.
b1e0: 2e 72 65 67 52 6f 77 2b 6e 2e 20 49 66 20 61 6e  .regRow+n. If an
b1f0: 79 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b  y of the child k
b200: 65 79 20 76 61 6c 75 65 73 20 61 72 65 20 4e 55  ey values are NU
b210: 4c 4c 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  LL, this .      
b220: 20 20 2a 2a 20 72 6f 77 20 63 61 6e 6e 6f 74 20    ** row cannot 
b230: 63 61 75 73 65 20 61 6e 20 46 4b 20 76 69 6f 6c  cause an FK viol
b240: 61 74 69 6f 6e 2e 20 4a 75 6d 70 20 64 69 72 65  ation. Jump dire
b250: 63 74 6c 79 20 74 6f 20 61 64 64 72 4f 6b 20 69  ctly to addrOk i
b260: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  n .        ** th
b270: 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
b280: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b290: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
b2a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
b2b0: 6f 6c 20 3d 20 61 69 43 6f 6c 73 20 3f 20 61 69  ol = aiCols ? ai
b2c0: 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61  Cols[j] : pFK->a
b2d0: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20  Col[j].iFrom;.  
b2e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b2f0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
b300: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
b310: 20 30 2c 20 69 43 6f 6c 2c 20 72 65 67 52 6f 77   0, iCol, regRow
b320: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +j);.          s
b330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b340: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
b350: 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29  egRow+j, addrOk)
b360: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b370: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
b380: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b390: 65 20 63 6f 64 65 20 74 6f 20 71 75 65 72 79 20  e code to query 
b3a0: 74 68 65 20 70 61 72 65 6e 74 20 69 6e 64 65 78  the parent index
b3b0: 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20   for a matching 
b3c0: 70 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  parent.        *
b3d0: 2a 20 6b 65 79 2e 20 49 66 20 61 20 6d 61 74 63  * key. If a matc
b3e0: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70  h is found, jump
b3f0: 20 74 6f 20 61 64 64 72 4f 6b 2e 20 2a 2f 0a 20   to addrOk. */. 
b400: 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20         if( pIdx 
b410: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b430: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b440: 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43   regRow, pFK->nC
b450: 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20 20 20 20  ol, regKey,.    
b460: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b470: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
b480: 72 28 64 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d  r(db,pIdx), pFK-
b490: 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  >nCol);.        
b4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b4b0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
b4c0: 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72  nd, i, addrOk, r
b4d0: 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  egKey, 0);.     
b4e0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b4f0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  e(v);.        }e
b500: 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 20  lse if( pParent 
b510: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
b520: 20 6a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64   jmp = sqlite3Vd
b530: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b540: 2b 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +2;.          sq
b550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b560: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
b570: 20 69 2c 20 6a 6d 70 2c 20 72 65 67 52 6f 77 29   i, jmp, regRow)
b580: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b590: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b5a0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
b5b0: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
b5c0: 20 20 20 61 73 73 65 72 74 28 20 70 46 4b 2d 3e     assert( pFK->
b5d0: 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nCol==1 );.     
b5e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
b5f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b600: 6f 20 72 65 70 6f 72 74 20 61 6e 20 46 4b 20 76  o report an FK v
b610: 69 6f 6c 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  iolation to the 
b620: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b630: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
b640: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
b650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b660: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
b670: 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31  , 0, regResult+1
b680: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b690: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b6b0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
b6c0: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
b6d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
b6e0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
b6f0: 64 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2b 32  d(v, regResult+2
b700: 2c 20 22 73 69 58 22 2c 20 70 46 4b 2d 3e 7a 54  , "siX", pFK->zT
b710: 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20 20  o, i-1);.       
b720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b730: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b740: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 34  ow, regResult, 4
b750: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b760: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b770: 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  el(v, addrOk);. 
b780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b790: 46 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73 29  Free(db, aiCols)
b7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b7b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b7c0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c  2(v, OP_Next, 0,
b7d0: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
b7e0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b800: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
b810: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  op);.    }.  }. 
b820: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
b830: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
b840: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
b850: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  */.#endif /* !de
b860: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b870: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
b880: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b890: 45 5f 4f 4d 49 54 5f 43 41 53 45 5f 53 45 4e 53  E_OMIT_CASE_SENS
b8a0: 49 54 49 56 45 5f 4c 49 4b 45 5f 50 52 41 47 4d  ITIVE_LIKE_PRAGM
b8b0: 41 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c  A.  /* Reinstall
b8c0: 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c   the LIKE and GL
b8d0: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
b8e0: 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20 4c 49  he variant of LI
b8f0: 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77 69 6c  KE.  ** used wil
b900: 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73 69 74  l be case sensit
b910: 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ive or not depen
b920: 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48 53 2e  ding on the RHS.
b930: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
b940: 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53 49 54  gTyp_CASE_SENSIT
b950: 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20  IVE_LIKE: {.    
b960: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b970: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
b980: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
b990: 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65 74 42  (db, sqlite3GetB
b9a0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
b9b0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
b9c0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
b9d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
b9e0: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b9f0: 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66 6e  _PRAGMA */..#ifn
ba00: 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  def SQLITE_INTEG
ba10: 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52  RITY_CHECK_ERROR
ba20: 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51  _MAX.# define SQ
ba30: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
ba40: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31  HECK_ERROR_MAX 1
ba50: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
ba60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
ba70: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20  NTEGRITY_CHECK. 
ba80: 20 2f 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e   /*    PRAGMA in
ba90: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20  tegrity_check.  
baa0: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  **    PRAGMA int
bab0: 65 67 72 69 74 79 5f 63 68 65 63 6b 28 4e 29 0a  egrity_check(N).
bac0: 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71    **    PRAGMA q
bad0: 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20  uick_check.  ** 
bae0: 20 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b 5f     PRAGMA quick_
baf0: 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20  check(N).  **.  
bb00: 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 69 6e  ** Verify the in
bb10: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 64  tegrity of the d
bb20: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
bb30: 2a 2a 20 54 68 65 20 22 71 75 69 63 6b 5f 63 68  ** The "quick_ch
bb40: 65 63 6b 22 20 69 73 20 72 65 64 75 63 65 64 20  eck" is reduced 
bb50: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
bb60: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bb70: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74   designed to det
bb80: 65 63 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73  ect most databas
bb90: 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a  e corruption.  *
bba0: 2a 20 77 69 74 68 6f 75 74 20 74 68 65 20 6f 76  * without the ov
bbb0: 65 72 68 65 61 64 20 6f 66 20 63 72 6f 73 73 2d  erhead of cross-
bbc0: 63 68 65 63 6b 69 6e 67 20 69 6e 64 65 78 65 73  checking indexes
bbd0: 2e 20 20 51 75 69 63 6b 5f 63 68 65 63 6b 0a 20  .  Quick_check. 
bbe0: 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72 20 74 69   ** is linear ti
bbf0: 6d 65 20 77 68 65 72 65 61 73 65 20 69 6e 74 65  me wherease inte
bc00: 67 72 69 74 79 5f 63 68 65 63 6b 20 69 73 20 4f  grity_check is O
bc10: 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (NlogN)..  */.  
bc20: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54  case PragTyp_INT
bc30: 45 47 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a  EGRITY_CHECK: {.
bc40: 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64      int i, j, ad
bc50: 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20  dr, mxErr;..    
bc60: 69 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73  int isQuick = (s
bc70: 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c  qlite3Tolower(zL
bc80: 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a  eft[0])=='q');..
bc90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52      /* If the PR
bca0: 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73  AGMA command was
bcb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52   of the form "PR
bcc0: 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72  AGMA <db>.integr
bcd0: 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20  ity_check",.    
bce0: 2a 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20 73  ** then iDb is s
bcf0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
bd00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
bd10: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64  identified by <d
bd20: 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  b>..    ** In th
bd30: 69 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74  is case, the int
bd40: 65 67 72 69 74 79 20 6f 66 20 64 61 74 61 62 61  egrity of databa
bd50: 73 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76  se iDb only is v
bd60: 65 72 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a  erified by.    *
bd70: 2a 20 74 68 65 20 56 44 42 45 20 63 72 65 61 74  * the VDBE creat
bd80: 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  ed below..    **
bd90: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
bda0: 65 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e  e, if the comman
bdb0: 64 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52  d was simply "PR
bdc0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
bdd0: 68 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a  heck" (or.    **
bde0: 20 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63   "PRAGMA quick_c
bdf0: 68 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62  heck"), then iDb
be00: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e   is set to 0. In
be10: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
be20: 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31  iDb.    ** to -1
be30: 20 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61   here, to indica
be40: 74 65 20 74 68 61 74 20 74 68 65 20 56 44 42 45  te that the VDBE
be50: 20 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74   should verify t
be60: 68 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20  he integrity.   
be70: 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63   ** of all attac
be80: 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  hed databases.  
be90: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
bea0: 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  Db>=0 );.    ass
beb0: 65 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70  ert( iDb==0 || p
bec0: 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66  Id2->z );.    if
bed0: 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69  ( pId2->z==0 ) i
bee0: 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a  Db = -1;..    /*
bef0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
bf00: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a  VDBE program */.
bf10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
bf20: 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   = 6;..    /* Se
bf30: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72  t the maximum er
bf40: 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  ror count */.   
bf50: 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f   mxErr = SQLITE_
bf60: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
bf70: 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69  ERROR_MAX;.    i
bf80: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
bf90: 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74     sqlite3GetInt
bfa0: 33 32 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72  32(zRight, &mxEr
bfb0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  r);.      if( mx
bfc0: 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err<=0 ){.      
bfd0: 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45    mxErr = SQLITE
bfe0: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
bff0: 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20  _ERROR_MAX;.    
c000: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
c010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c020: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
c030: 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f 2a 20 72  xErr-1, 1); /* r
c040: 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f  eg[1] holds erro
c050: 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20  rs left */..    
c060: 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69  /* Do an integri
c070: 74 79 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68  ty check on each
c080: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
c090: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
c0a0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
c0b0: 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a        HashElem *
c0c0: 78 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  x;     /* For lo
c0d0: 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
c0e0: 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  s in the schema 
c0f0: 2a 2f 0a 20 20 20 20 20 20 48 61 73 68 20 2a 70  */.      Hash *p
c100: 54 62 6c 73 3b 20 20 20 20 20 2f 2a 20 53 65 74  Tbls;     /* Set
c110: 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
c120: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  n the schema */.
c130: 20 20 20 20 20 20 69 6e 74 20 2a 61 52 6f 6f 74        int *aRoot
c140: 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ;      /* Array 
c150: 6f 66 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  of root page num
c160: 62 65 72 73 20 6f 66 20 61 6c 6c 20 62 74 72 65  bers of all btre
c170: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
c180: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  cnt = 0;     /* 
c190: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
c1a0: 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a  s in aRoot[] */.
c1b0: 20 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20        int mxIdx 
c1c0: 3d 20 30 3b 20 20 20 2f 2a 20 4d 61 78 69 6d 75  = 0;   /* Maximu
c1d0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  m number of inde
c1e0: 78 65 73 20 66 6f 72 20 61 6e 79 20 74 61 62 6c  xes for any tabl
c1f0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
c200: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
c210: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
c220: 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30        if( iDb>=0
c230: 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e   && i!=iDb ) con
c240: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71  tinue;..      sq
c250: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
c260: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
c270: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61  ;..      /* Do a
c280: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
c290: 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a  k of the B-Tree.
c2a0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c2b0: 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69  * Begin by findi
c2c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
c2d0: 73 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20  s numbers.      
c2e0: 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ** for all table
c2f0: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e  s and indices in
c300: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
c310: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
c320: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c330: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c340: 20 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20   i, 0) );.      
c350: 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62  pTbls = &db->aDb
c360: 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [i].pSchema->tbl
c370: 48 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hash;.      for(
c380: 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48  cnt=0, x=sqliteH
c390: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
c3a0: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
c3b0: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
c3c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c3d0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
c3e0: 29 3b 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74  );  /* Current t
c3f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
c400: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
c430: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 20   pTab */.       
c440: 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20   int nIdx;      
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c470: 69 6e 64 65 78 65 73 20 6f 6e 20 70 54 61 62 20  indexes on pTab 
c480: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  */.        if( H
c490: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
c4a0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  cnt++;.        f
c4b0: 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d  or(nIdx=0, pIdx=
c4c0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c4d0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
c4e0: 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63  Next, nIdx++){ c
c4f0: 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  nt++; }.        
c500: 69 66 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29  if( nIdx>mxIdx )
c510: 20 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20   mxIdx = nIdx;. 
c520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f       }.      aRo
c530: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
c540: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c550: 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31  zeof(int)*(cnt+1
c560: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52  ));.      if( aR
c570: 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oot==0 ) break;.
c580: 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c        for(cnt=0,
c590: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72   x=sqliteHashFir
c5a0: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
c5b0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
c5c0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
c5d0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c5e0: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
c5f0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
c600: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  ;.        if( Ha
c610: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 61  sRowid(pTab) ) a
c620: 52 6f 6f 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 54  Root[++cnt] = pT
c630: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ab->tnum;.      
c640: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
c650: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
c660: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c670: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f  {.          aRoo
c680: 74 5b 2b 2b 63 6e 74 5d 20 3d 20 70 49 64 78 2d  t[++cnt] = pIdx-
c690: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d  >tnum;.        }
c6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
c6b0: 52 6f 6f 74 5b 30 5d 20 3d 20 63 6e 74 3b 0a 0a  Root[0] = cnt;..
c6c0: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
c6d0: 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75  re sufficient nu
c6e0: 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
c6f0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  s have been allo
c700: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  cated */.      p
c710: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
c720: 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c  X( pParse->nMem,
c730: 20 38 2b 6d 78 49 64 78 20 29 3b 0a 20 20 20 20   8+mxIdx );.    
c740: 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
c750: 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
c760: 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f  e);..      /* Do
c770: 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65   the b-tree inte
c780: 67 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a  grity checks */.
c790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c7a0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
c7b0: 74 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e  tegrityCk, 2, cn
c7c0: 74 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f  t, 1, (char*)aRo
c7d0: 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  ot,P4_INTARRAY);
c7e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c7f0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
c800: 38 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72  8)i);.      addr
c810: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c820: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
c830: 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72  l, 2); VdbeCover
c840: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
c850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
c860: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
c870: 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 3, 0,.        
c880: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c890: 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61  db, "*** in data
c8a0: 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20  base %s ***\n", 
c8b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
c8c0: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50  ame),.         P
c8d0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
c8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c8f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
c900: 2c 20 32 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 2, 3, 3);.    
c910: 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b    integrityCheck
c920: 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
c930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c940: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
c950: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
c960: 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e   sure all the in
c970: 64 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72  dices are constr
c980: 75 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  ucted correctly.
c990: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c9a0: 66 6f 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68  for(x=sqliteHash
c9b0: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
c9c0: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
c9d0: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
c9e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c9f0: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
ca00: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
ca10: 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20  Idx, *pPk;.     
ca20: 20 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72     Index *pPrior
ca30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
ca40: 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20  t loopTop;.     
ca50: 20 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c     int iDataCur,
ca60: 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
ca70: 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a    int r1 = -1;..
ca80: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
ca90: 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69  ->tnum<1 ) conti
caa0: 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49  nue;  /* Skip VI
cab0: 45 57 73 20 6f 72 20 56 49 52 54 55 41 4c 20 54  EWs or VIRTUAL T
cac0: 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20 20  ABLEs */.       
cad0: 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28   pPk = HasRowid(
cae0: 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69  pTab) ? 0 : sqli
caf0: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
cb00: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
cb10: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
cb20: 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61  leAndIndices(pPa
cb30: 72 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  rse, pTab, OP_Op
cb40: 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20 20 20 20  enRead, 0,.     
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
cb70: 20 30 2c 20 26 69 44 61 74 61 43 75 72 2c 20 26   0, &iDataCur, &
cb80: 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
cb90: 20 20 2f 2a 20 72 65 67 5b 37 5d 20 63 6f 75 6e    /* reg[7] coun
cba0: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
cbb0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
cbc0: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a  table..        *
cbd0: 2a 20 72 65 67 5b 38 2b 69 5d 20 63 6f 75 6e 74  * reg[8+i] count
cbe0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
cbf0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69  entries in the i
cc00: 2d 74 68 20 69 6e 64 65 78 20 0a 20 20 20 20 20  -th index .     
cc10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
cc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cc30: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
cc40: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 7);.        fo
cc50: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
cc60: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
cc70: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
cc80: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
cc90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cca0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
ccb0: 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69  r, 0, 8+j); /* i
ccc0: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75  ndex entries cou
ccd0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  nter */.        
cce0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
ccf0: 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d  ( pParse->nMem>=
cd00: 38 2b 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61  8+j );.        a
cd10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f  ssert( sqlite3No
cd20: 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61  TempsInRange(pPa
cd30: 72 73 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20  rse,1,7+j) );.  
cd40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
cd60: 77 69 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  wind, iDataCur, 
cd70: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
cd80: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f  (v);.        loo
cd90: 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  pTop = sqlite3Vd
cda0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
cdb0: 64 64 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20  ddImm, 7, 1);.  
cdc0: 20 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69        if( !isQui
cdd0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
cde0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 20  /* Sanity check 
cdf0: 6f 6e 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  on record header
ce00: 20 64 65 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20   decoding */.   
ce10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ce30: 6f 6c 75 6d 6e 2c 20 69 44 61 74 61 43 75 72 2c  olumn, iDataCur,
ce40: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33   pTab->nCol-1, 3
ce50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ce60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
ce70: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
ce80: 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 7d  FARG);.        }
ce90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
cea0: 66 79 20 74 68 61 74 20 61 6c 6c 20 4e 4f 54 20  fy that all NOT 
ceb0: 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 72 65 61  NULL columns rea
cec0: 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c  lly are NOT NULL
ced0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
cee0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
cef0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
cf00: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
cf10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70           int jmp
cf20: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  2;.          if(
cf30: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
cf40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
cf50: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
cf60: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
cf70: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
cf80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cf90: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
cfa0: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
cfb0: 2c 20 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 33  , iDataCur, j, 3
cfc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cfd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
cfe0: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
cff0: 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
d000: 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56   jmp2 = sqlite3V
d010: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d020: 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62  NotNull, 3); Vdb
d030: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d040: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73          zErr = s
d050: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d060: 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e  , "NULL value in
d070: 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a   %s.%s", pTab->z
d080: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a      pTab->aCol[j
d0b0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
d0c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d0d0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
d0e0: 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45  ng8, 0, 3, 0, zE
d0f0: 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  rr, P4_DYNAMIC);
d100: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67  .          integ
d110: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
d120: 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ow(v);.         
d130: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d140: 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20  Here(v, jmp2);. 
d150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d160: 20 2f 2a 20 56 65 72 69 66 79 20 43 48 45 43 4b   /* Verify CHECK
d170: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
d180: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
d190: 2d 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d  ->pCheck && (db-
d1a0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d1b0: 49 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30  IgnoreChecks)==0
d1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
d1d0: 70 72 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d  prList *pCheck =
d1e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d1f0: 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 43  Dup(db, pTab->pC
d200: 68 65 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  heck, 0);.      
d210: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
d220: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
d230: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
d240: 64 64 72 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c  ddrCkFault = sql
d250: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d260: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
d270: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 43         int addrC
d280: 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kOk = sqlite3Vdb
d290: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
d2a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
d2b0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
d2c0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
d2d0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
d2e0: 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 44  e->iSelfTab = iD
d2f0: 61 74 61 43 75 72 20 2b 20 31 3b 0a 20 20 20 20  ataCur + 1;.    
d300: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 43          for(k=pC
d310: 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b  heck->nExpr-1; k
d320: 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; k--){.      
d330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d340: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
d350: 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e  e, pCheck->a[k].
d360: 70 45 78 70 72 2c 20 61 64 64 72 43 6b 46 61 75  pExpr, addrCkFau
d370: 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  lt, 0);.        
d380: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d390: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
d3a0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 43 68 65  rue(pParse, pChe
d3b0: 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  ck->a[0].pExpr, 
d3c0: 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20 20 20 20  addrCkOk, .     
d3d0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d3e0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
d3f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d400: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d410: 65 6c 28 76 2c 20 61 64 64 72 43 6b 46 61 75 6c  el(v, addrCkFaul
d420: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
d430: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
d440: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d450: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
d460: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 48 45  MPrintf(db, "CHE
d470: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  CK constraint fa
d480: 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20 20 20  iled in %s",.   
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
d4a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
d4b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4c0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
d4d0: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
d4e0: 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
d4f0: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
d500: 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65  integrityCheckRe
d510: 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20  sultRow(v);.    
d520: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d530: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d540: 76 2c 20 61 64 64 72 43 6b 4f 6b 29 3b 0a 20 20  v, addrCkOk);.  
d550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d560: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
d570: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
d580: 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  heck);.        }
d590: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
d5a0: 51 75 69 63 6b 20 29 7b 20 2f 2a 20 4f 6d 69 74  Quick ){ /* Omit
d5b0: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74   the remaining t
d5c0: 65 73 74 73 20 66 6f 72 20 71 75 69 63 6b 5f 63  ests for quick_c
d5d0: 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  heck */.        
d5e0: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 69 6e    /* Validate in
d5f0: 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72 20  dex entries for 
d600: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
d610: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
d620: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
d630: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d640: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
d650: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
d660: 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70     int jmp2, jmp
d670: 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20  3, jmp4, jmp5;. 
d680: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
d690: 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74 65 33 56  kUniq = sqlite3V
d6a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
d6b0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
d6c0: 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20    if( pPk==pIdx 
d6d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d6e0: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
d6f0: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
d700: 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
d710: 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20  x, iDataCur, 0, 
d720: 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20  0, &jmp3,.      
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a     pPrior, r1);.
d760: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
d770: 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  or = pIdx;.     
d780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d790: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
d7a0: 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f  ddImm, 8+j, 1);/
d7b0: 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72  * increment entr
d7c0: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  y count */.     
d7d0: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
d7e0: 20 74 68 61 74 20 61 6e 20 69 6e 64 65 78 20 65   that an index e
d7f0: 6e 74 72 79 20 65 78 69 73 74 73 20 66 6f 72 20  ntry exists for 
d800: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
d810: 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  e row */.       
d820: 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69       jmp2 = sqli
d830: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d840: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49  (v, OP_Found, iI
d850: 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c  dxCur+j, ckUniq,
d860: 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r1,.           
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
d890: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62  x->nColumn); Vdb
d8a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d8b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d8c0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d8d0: 76 2c 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20  v, 3, "row ");. 
d8e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d8f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d900: 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33 2c  OP_Concat, 7, 3,
d910: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
d920: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
d930: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d  String(v, 4, " m
d940: 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65  issing from inde
d950: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
d960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d970: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d980: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
d990: 20 20 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73          jmp5 = s
d9a0: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
d9b0: 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d  ring(v, 4, pIdx-
d9c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
d9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d9e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
d9f0: 63 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20  cat, 4, 3, 3);. 
da00: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 34 20             jmp4 
da10: 3d 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b  = integrityCheck
da20: 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
da30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
da40: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
da50: 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20   jmp2);.        
da60: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51 55      /* For UNIQU
da70: 45 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69 66  E indexes, verif
da80: 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65 20  y that only one 
da90: 65 6e 74 72 79 20 65 78 69 73 74 73 20 77 69 74  entry exists wit
daa0: 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  h the.          
dab0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79    ** current key
dac0: 2e 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20  .  The entry is 
dad0: 75 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e  unique if (1) an
dae0: 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  y column is NULL
daf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
db00: 6f 72 20 28 32 29 20 74 68 65 20 6e 65 78 74 20  or (2) the next 
db10: 65 6e 74 72 79 20 68 61 73 20 61 20 64 69 66 66  entry has a diff
db20: 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20  erent key */.   
db30: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 55           if( IsU
db40: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
db50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
db60: 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73    int uniqOk = s
db70: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
db80: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
db90: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
dba0: 6d 70 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mp6;.           
dbb0: 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20     int kk;.     
dbc0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d           for(kk=
dbd0: 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  0; kk<pIdx->nKey
dbe0: 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20  Col; kk++){.    
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
dc00: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
dc10: 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20  olumn[kk];.     
dc20: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
dc30: 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49  t( iCol!=XN_ROWI
dc40: 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  D && iCol<pTab->
dc50: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
dc60: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
dc70: 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  >=0 && pTab->aCo
dc80: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
dc90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
dcb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
dcc0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b   OP_IsNull, r1+k
dcd0: 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  k, uniqOk);.    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
dcf0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
dd00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
dd10: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 36 20             jmp6 
dd20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
dd30: 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op1(v, OP_Next, 
dd40: 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64 62 65  iIdxCur+j); Vdbe
dd50: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
dd60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dd70: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e  e3VdbeGoto(v, un
dd80: 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  iqOk);.         
dd90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dda0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 36  JumpHere(v, jmp6
ddb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ddc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ddd0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 47  p4Int(v, OP_IdxG
dde0: 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75 6e  T, iIdxCur+j, un
ddf0: 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20 20  iqOk, r1,.      
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
de20: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
de30: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
de40: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
de50: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
de60: 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69  g(v, 3, "non-uni
de70: 71 75 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64  que entry in ind
de80: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ex ");.         
de90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dea0: 47 6f 74 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20  Goto(v, jmp5);. 
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dec0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
ded0: 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b 29 3b  abel(v, uniqOk);
dee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
def0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
df00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
df10: 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20  , jmp4);.       
df20: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f       sqlite3Reso
df30: 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
df40: 70 50 61 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20  pParse, jmp3);. 
df50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
df60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
df70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
df80: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74 61  , OP_Next, iData
df90: 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56  Cur, loopTop); V
dfa0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
dfb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dfc0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c  dbeJumpHere(v, l
dfd0: 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64  oopTop-1);.#ifnd
dfe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
dff0: 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
e000: 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29    if( !isQuick )
e010: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e020: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
e030: 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23  g(v, 2, "wrong #
e040: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69   of entries in i
e050: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
e060: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78     for(j=0, pIdx
e070: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
e080: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
e090: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
e0a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b           if( pPk
e0b0: 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  ==pIdx ) continu
e0c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
e0d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e0e0: 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49  (v, OP_Count, iI
e0f0: 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20 20 20  dxCur+j, 3);.   
e100: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
e110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e120: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c  3(v, OP_Eq, 8+j,
e130: 20 30 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65   0, 3); VdbeCove
e140: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
e150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e160: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
e170: 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TE_NOTNULL);.   
e180: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e190: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
e1a0: 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  , 4, pIdx->zName
e1b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
e1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e1d0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
e1e0: 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 2, 3);.       
e1f0: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
e200: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b  eckResultRow(v);
e210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
e220: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e230: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
e240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e250: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e260: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
e270: 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20  T */.      } .  
e280: 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20 20 20 20    }.    {.      
e290: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
e2a0: 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53   iLn = VDBE_OFFS
e2b0: 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20  ET_LINENO(2);.  
e2c0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e2d0: 20 56 64 62 65 4f 70 4c 69 73 74 20 65 6e 64 43   VdbeOpList endC
e2e0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
e2f0: 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20    { OP_AddImm,  
e300: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
e310: 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a   0},    /* 0 */.
e320: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 4e          { OP_IfN
e330: 6f 74 5a 65 72 6f 2c 20 20 20 31 2c 20 34 2c 20  otZero,   1, 4, 
e340: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e350: 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   1 */.        { 
e360: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20  OP_String8,     
e370: 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
e380: 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20      /* 2 */.    
e390: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
e3a0: 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20 20 20 20  ow,   3, 1,     
e3b0: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a     0},    /* 3 *
e3c0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 48  /.        { OP_H
e3d0: 61 6c 74 2c 20 20 20 20 20 20 20 20 30 2c 20 30  alt,        0, 0
e3e0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
e3f0: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 4 */.        
e400: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
e410: 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30    0, 3,        0
e420: 7d 2c 20 20 20 20 2f 2a 20 35 20 2a 2f 0a 20 20  },    /* 5 */.  
e430: 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
e440: 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20          0, 3,   
e450: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 36       0},    /* 6
e460: 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   */.      };.   
e470: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
e480: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
e490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
e4a0: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 65  t(v, ArraySize(e
e4b0: 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65  ndCode), endCode
e4c0: 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66  , iLn);.      if
e4d0: 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  ( aOp ){.       
e4e0: 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 31 2d 6d   aOp[0].p2 = 1-m
e4f0: 78 45 72 72 3b 0a 20 20 20 20 20 20 20 20 61 4f  xErr;.        aO
e500: 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d 20 50 34  p[2].p4type = P4
e510: 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20  _STATIC;.       
e520: 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22   aOp[2].p4.z = "
e530: 6f 6b 22 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  ok";.        aOp
e540: 5b 35 5d 2e 70 34 74 79 70 65 20 3d 20 50 34 5f  [5].p4type = P4_
e550: 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20 20 20  STATIC;.        
e560: 61 4f 70 5b 35 5d 2e 70 34 2e 7a 20 3d 20 28 63  aOp[5].p4.z = (c
e570: 68 61 72 2a 29 73 71 6c 69 74 65 33 45 72 72 53  har*)sqlite3ErrS
e580: 74 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  tr(SQLITE_CORRUP
e590: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
e5a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e5b0: 6e 67 65 50 33 28 76 2c 20 30 2c 20 73 71 6c 69  ngeP3(v, 0, sqli
e5c0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e5d0: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 7d 0a  dr(v)-2);.    }.
e5e0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
e5f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e600: 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
e610: 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
e620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
e630: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
e640: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a  GMA encoding.  *
e650: 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  *   PRAGMA encod
e660: 69 6e 67 20 3d 20 22 75 74 66 2d 38 22 7c 22 75  ing = "utf-8"|"u
e670: 74 66 2d 31 36 22 7c 22 75 74 66 2d 31 36 6c 65  tf-16"|"utf-16le
e680: 22 7c 22 75 74 66 2d 31 36 62 65 22 0a 20 20 2a  "|"utf-16be".  *
e690: 2a 0a 20 20 2a 2a 20 49 6e 20 69 74 73 20 66 69  *.  ** In its fi
e6a0: 72 73 74 20 66 6f 72 6d 2c 20 74 68 69 73 20 70  rst form, this p
e6b0: 72 61 67 6d 61 20 72 65 74 75 72 6e 73 20 74 68  ragma returns th
e6c0: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
e6d0: 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61  e main.  ** data
e6e0: 62 61 73 65 2e 20 49 66 20 74 68 65 20 64 61 74  base. If the dat
e6f0: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 69 6e 69  abase is not ini
e700: 74 69 61 6c 69 7a 65 64 2c 20 69 74 20 69 73 20  tialized, it is 
e710: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e  initialized now.
e720: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
e730: 65 63 6f 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68  econd form of th
e740: 69 73 20 70 72 61 67 6d 61 20 69 73 20 61 20 6e  is pragma is a n
e750: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6d 61 69 6e  o-op if the main
e760: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
e770: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
e780: 61 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ady been initial
e790: 69 7a 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ized. In this ca
e7a0: 73 65 20 69 74 20 73 65 74 73 20 74 68 65 20 64  se it sets the d
e7b0: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f  efault.  ** enco
e7c0: 64 69 6e 67 20 74 68 61 74 20 77 69 6c 6c 20 62  ding that will b
e7d0: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d  e used for the m
e7e0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
e7f0: 65 20 69 66 20 61 20 6e 65 77 20 66 69 6c 65 0a  e if a new file.
e800: 20 20 2a 2a 20 69 73 20 63 72 65 61 74 65 64 2e    ** is created.
e810: 20 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   If an existing 
e820: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
e830: 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68  le is opened, th
e840: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61  en the.  ** defa
e850: 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ult text encodin
e860: 67 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 69  g for the existi
e870: 6e 67 20 64 61 74 61 62 61 73 65 20 69 73 20 75  ng database is u
e880: 73 65 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  sed..  ** .  ** 
e890: 49 6e 20 61 6c 6c 20 63 61 73 65 73 20 6e 65 77  In all cases new
e8a0: 20 64 61 74 61 62 61 73 65 73 20 63 72 65 61 74   databases creat
e8b0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
e8c0: 41 43 48 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a  ACH command are.
e8d0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 74 6f 20    ** created to 
e8e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 65 66  use the same def
e8f0: 61 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69  ault text encodi
e900: 6e 67 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64  ng as the main d
e910: 61 74 61 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a  atabase. If.  **
e920: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e930: 73 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  se has not been 
e940: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f  initialized and/
e950: 6f 72 20 63 72 65 61 74 65 64 20 77 68 65 6e 20  or created when 
e960: 41 54 54 41 43 48 0a 20 20 2a 2a 20 69 73 20 65  ATTACH.  ** is e
e970: 78 65 63 75 74 65 64 2c 20 74 68 69 73 20 69 73  xecuted, this is
e980: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
e990: 20 41 54 54 41 43 48 20 6f 70 65 72 61 74 69 6f   ATTACH operatio
e9a0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  n..  **.  ** In 
e9b0: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
e9c0: 74 68 69 73 20 70 72 61 67 6d 61 20 73 65 74 73  this pragma sets
e9d0: 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   the text encodi
e9e0: 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e  ng to be used in
e9f0: 0a 20 20 2a 2a 20 6e 65 77 20 64 61 74 61 62 61  .  ** new databa
ea00: 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
ea10: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
ea20: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 49 74 20  base handle. It 
ea30: 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65  is only.  ** use
ea40: 66 75 6c 20 69 66 20 69 6e 76 6f 6b 65 64 20 69  ful if invoked i
ea50: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
ea60: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ea70: 73 65 20 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65  se i.  */.  case
ea80: 20 50 72 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e   PragTyp_ENCODIN
ea90: 47 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  G: {.    static 
eaa0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63  const struct Enc
eab0: 4e 61 6d 65 20 7b 0a 20 20 20 20 20 20 63 68 61  Name {.      cha
eac0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  r *zName;.      
ead0: 75 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e  u8 enc;.    } en
eae0: 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  cnames[] = {.   
eaf0: 20 20 20 7b 20 22 55 54 46 38 22 2c 20 20 20 20     { "UTF8",    
eb00: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20   SQLITE_UTF8    
eb10: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
eb20: 55 54 46 2d 38 22 2c 20 20 20 20 53 51 4c 49 54  UTF-8",    SQLIT
eb30: 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c  E_UTF8        },
eb40: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
eb50: 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20  ment [1] */.    
eb60: 20 20 7b 20 22 55 54 46 2d 31 36 6c 65 22 2c 20    { "UTF-16le", 
eb70: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20  SQLITE_UTF16LE  
eb80: 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62     },  /* Must b
eb90: 65 20 65 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f  e element [2] */
eba0: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36  .      { "UTF-16
ebb0: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
ebc0: 36 42 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d  6BE     },  /* M
ebd0: 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b  ust be element [
ebe0: 33 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  3] */.      { "U
ebf0: 54 46 31 36 6c 65 22 2c 20 20 53 51 4c 49 54 45  TF16le",  SQLITE
ec00: 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a  _UTF16LE     },.
ec10: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 62 65        { "UTF16be
ec20: 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ",  SQLITE_UTF16
ec30: 42 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  BE     },.      
ec40: 7b 20 22 55 54 46 2d 31 36 22 2c 20 20 20 30 20  { "UTF-16",   0 
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54   }, /* SQLITE_UT
ec70: 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20  F16NATIVE */.   
ec80: 20 20 20 7b 20 22 55 54 46 31 36 22 2c 20 20 20     { "UTF16",   
ec90: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
eca0: 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45      }, /* SQLITE
ecb0: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a  _UTF16NATIVE */.
ecc0: 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
ecd0: 20 20 20 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20     };.    const 
ece0: 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a  struct EncName *
ecf0: 70 45 6e 63 3b 0a 20 20 20 20 69 66 28 20 21 7a  pEnc;.    if( !z
ed00: 52 69 67 68 74 20 29 7b 20 20 20 20 2f 2a 20 22  Right ){    /* "
ed10: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22  PRAGMA encoding"
ed20: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
ed30: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
ed40: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
ed50: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
ed60: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
ed70: 73 5b 53 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65  s[SQLITE_UTF8].e
ed80: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
ed90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eda0: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
edb0: 5f 55 54 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53  _UTF16LE].enc==S
edc0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b  QLITE_UTF16LE );
edd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
ede0: 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55  ncnames[SQLITE_U
edf0: 54 46 31 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c  TF16BE].enc==SQL
ee00: 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20  ITE_UTF16BE );. 
ee10: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
ee20: 65 54 65 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65  eText(v, encname
ee30: 73 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  s[ENC(pParse->db
ee40: 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  )].zName);.    }
ee50: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee70: 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  "PRAGMA encoding
ee80: 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20 20 20   = XXX" */.     
ee90: 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20   /* Only change 
eea0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  the value of sql
eeb0: 69 74 65 2e 65 6e 63 20 69 66 20 74 68 65 20 64  ite.enc if the d
eec0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69  atabase handle i
eed0: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69  s not.      ** i
eee0: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 66 20 74  nitialized. If t
eef0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
ef00: 20 65 78 69 73 74 73 2c 20 74 68 65 20 6e 65 77   exists, the new
ef10: 20 73 71 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75   sqlite.enc valu
ef20: 65 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  e.      ** will 
ef30: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
ef40: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 69  hen the schema i
ef50: 73 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e 20 49  s next loaded. I
ef60: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  f it does not.  
ef70: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65      ** already e
ef80: 78 69 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62  xists, it will b
ef90: 65 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65  e created to use
efa0: 20 74 68 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e   the new encodin
efb0: 67 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a  g value..      *
efc0: 2f 0a 20 20 20 20 20 20 69 66 28 20 0a 20 20 20  /.      if( .   
efd0: 20 20 20 20 20 21 28 44 62 48 61 73 50 72 6f 70       !(DbHasProp
efe0: 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53  erty(db, 0, DB_S
eff0: 63 68 65 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c  chemaLoaded)) ||
f000: 20 0a 20 20 20 20 20 20 20 20 44 62 48 61 73 50   .        DbHasP
f010: 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44  roperty(db, 0, D
f020: 42 5f 45 6d 70 74 79 29 20 0a 20 20 20 20 20 20  B_Empty) .      
f030: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  ){.        for(p
f040: 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d  Enc=&encnames[0]
f050: 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70  ; pEnc->zName; p
f060: 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Enc++){.        
f070: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
f080: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
f090: 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  pEnc->zName) ){.
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 53 43 48 45              SCHE
f0b0: 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20 45 4e 43  MA_ENC(db) = ENC
f0c0: 28 64 62 29 20 3d 0a 20 20 20 20 20 20 20 20 20  (db) =.         
f0d0: 20 20 20 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63         pEnc->enc
f0e0: 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53   ? pEnc->enc : S
f0f0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
f100: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  E;.            b
f110: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
f120: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
f130: 20 20 20 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a      if( !pEnc->z
f140: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
f150: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f160: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70  g(pParse, "unsup
f170: 70 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a  ported encoding:
f180: 20 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20   %s", zRight);. 
f190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f1a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
f1b0: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
f1c0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
f1d0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f1e0: 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56  TE_OMIT_SCHEMA_V
f1f0: 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20  ERSION_PRAGMAS. 
f200: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
f210: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d  A [schema.]schem
f220: 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20  a_version.  **  
f230: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f240: 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20  ]schema_version 
f250: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
f260: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
f270: 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72  schema.]user_ver
f280: 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47  sion.  **   PRAG
f290: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72  MA [schema.]user
f2a0: 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65  _version = <inte
f2b0: 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ger>.  **.  **  
f2c0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f2d0: 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a  ]freelist_count.
f2e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
f2f0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61  MA [schema.]data
f300: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20  _version.  **.  
f310: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
f320: 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e  ema.]application
f330: 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  _id.  **   PRAGM
f340: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69  A [schema.]appli
f350: 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74  cation_id = <int
f360: 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger>.  **.  ** 
f370: 54 68 65 20 70 72 61 67 6d 61 27 73 20 73 63 68  The pragma's sch
f380: 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema_version and 
f390: 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 61 72 65  user_version are
f3a0: 20 75 73 65 64 20 74 6f 20 73 65 74 20 6f 72 20   used to set or 
f3b0: 67 65 74 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  get.  ** the val
f3c0: 75 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  ue of the schema
f3d0: 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65  -version and use
f3e0: 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65 73 70 65  r-version, respe
f3f0: 63 74 69 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20  ctively. Both.  
f400: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
f410: 72 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 75 73  rsion and the us
f420: 65 72 2d 76 65 72 73 69 6f 6e 20 61 72 65 20 33  er-version are 3
f430: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
f440: 65 67 65 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65  egers.  ** store
f450: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
f460: 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20  e header..  **. 
f470: 20 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 2d 63   ** The schema-c
f480: 6f 6f 6b 69 65 20 69 73 20 75 73 75 61 6c 6c 79  ookie is usually
f490: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
f4a0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
f4b0: 53 51 4c 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20  SQLite. It.  ** 
f4c0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
f4d0: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 65 76 65  y SQLite wheneve
f4e0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
f4f0: 63 68 65 6d 61 20 69 73 20 6d 6f 64 69 66 69 65  chema is modifie
f500: 64 20 28 62 79 0a 20 20 2a 2a 20 63 72 65 61 74  d (by.  ** creat
f510: 69 6e 67 20 6f 72 20 64 72 6f 70 70 69 6e 67 20  ing or dropping 
f520: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
f530: 29 2e 20 54 68 65 20 73 63 68 65 6d 61 20 76 65  ). The schema ve
f540: 72 73 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  rsion is used by
f550: 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 65 61 63  .  ** SQLite eac
f560: 68 20 74 69 6d 65 20 61 20 71 75 65 72 79 20 69  h time a query i
f570: 73 20 65 78 65 63 75 74 65 64 20 74 6f 20 65 6e  s executed to en
f580: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
f590: 74 65 72 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a  ternal cache.  *
f5a0: 2a 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  * of the schema 
f5b0: 75 73 65 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c  used when compil
f5c0: 69 6e 67 20 74 68 65 20 53 51 4c 20 71 75 65 72  ing the SQL quer
f5d0: 79 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 63  y matches the sc
f5e0: 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65  hema of.  ** the
f5f0: 20 64 61 74 61 62 61 73 65 20 61 67 61 69 6e 73   database agains
f600: 74 20 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70  t which the comp
f610: 69 6c 65 64 20 71 75 65 72 79 20 69 73 20 61 63  iled query is ac
f620: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 2e  tually executed.
f630: 0a 20 20 2a 2a 20 53 75 62 76 65 72 74 69 6e 67  .  ** Subverting
f640: 20 74 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   this mechanism 
f650: 62 79 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  by using "PRAGMA
f660: 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22   schema_version"
f670: 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20   to modify.  ** 
f680: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
f690: 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  on is potentiall
f6a0: 79 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20  y dangerous and 
f6b0: 6d 61 79 20 6c 65 61 64 20 74 6f 20 70 72 6f 67  may lead to prog
f6c0: 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73 68 65 73  ram.  ** crashes
f6d0: 20 6f 72 20 64 61 74 61 62 61 73 65 20 63 6f 72   or database cor
f6e0: 72 75 70 74 69 6f 6e 2e 20 55 73 65 20 77 69 74  ruption. Use wit
f6f0: 68 20 63 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a  h caution!.  **.
f700: 20 20 2a 2a 20 54 68 65 20 75 73 65 72 2d 76 65    ** The user-ve
f710: 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65  rsion is not use
f720: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
f730: 53 51 4c 69 74 65 2e 20 49 74 20 6d 61 79 20 62  SQLite. It may b
f740: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 61  e used by.  ** a
f750: 70 70 6c 69 63 61 74 69 6f 6e 73 20 66 6f 72 20  pplications for 
f760: 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a  any purpose..  *
f770: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
f780: 5f 48 45 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b  _HEADER_VALUE: {
f790: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
f7a0: 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67   = pPragma->iArg
f7b0: 3b 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b  ;  /* Which cook
f7c0: 69 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ie to read or wr
f7d0: 69 74 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ite */.    sqlit
f7e0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
f7f0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  v, iDb);.    if(
f800: 20 7a 52 69 67 68 74 20 26 26 20 28 70 50 72 61   zRight && (pPra
f810: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
f820: 50 72 61 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79  PragFlg_ReadOnly
f830: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
f840: 20 57 72 69 74 65 20 74 68 65 20 73 70 65 63 69   Write the speci
f850: 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75  fied cookie valu
f860: 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  e */.      stati
f870: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
f880: 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d  st setCookie[] =
f890: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
f8a0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
f8b0: 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  1,  0},    /
f8c0: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
f8d0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
f8e0: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20      0,  0,  0}, 
f8f0: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
f900: 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70   };.      VdbeOp
f910: 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c   *aOp;.      sql
f920: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
f930: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76  MallocRequired(v
f940: 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 43  , ArraySize(setC
f950: 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61  ookie));.      a
f960: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
f970: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f980: 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65  aySize(setCookie
f990: 29 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29  ), setCookie, 0)
f9a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59  ;.      if( ONLY
f9b0: 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  _IF_REALLOC_STRE
f9c0: 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65  SS(aOp==0) ) bre
f9d0: 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d  ak;.      aOp[0]
f9e0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f9f0: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
fa00: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
fa10: 32 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  2 = iCookie;.   
fa20: 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73     aOp[1].p3 = s
fa30: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
fa40: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
fa50: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
fa60: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69   specified cooki
fa70: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  e value */.     
fa80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
fa90: 62 65 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f  beOpList readCoo
faa0: 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  kie[] = {.      
fab0: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
fac0: 6f 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20  on,     0,  0,  
fad0: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
fae0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
faf0: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20  Cookie,      0, 
fb00: 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31   1,  0},    /* 1
fb10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
fb20: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20  _ResultRow,     
fb30: 20 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20    1,  1,  0}.   
fb40: 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65     };.      Vdbe
fb50: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73  Op *aOp;.      s
fb60: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
fb70: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
fb80: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65  (v, ArraySize(re
fb90: 61 64 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20  adCookie));.    
fba0: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
fbb0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
fbc0: 41 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f  ArraySize(readCo
fbd0: 6f 6b 69 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65  okie),readCookie
fbe0: 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f  ,0);.      if( O
fbf0: 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53  NLY_IF_REALLOC_S
fc00: 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20  TRESS(aOp==0) ) 
fc10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70  break;.      aOp
fc20: 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [0].p1 = iDb;.  
fc30: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20      aOp[1].p1 = 
fc40: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
fc50: 5d 2e 70 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a  ].p3 = iCookie;.
fc60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc70: 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20  eReusable(v);.  
fc80: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
fc90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
fca0: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45  E_OMIT_SCHEMA_VE
fcb0: 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f  RSION_PRAGMAS */
fcc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fcd0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
fce0: 49 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20  ION_DIAGS.  /*. 
fcf0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d   **   PRAGMA com
fd00: 70 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a  pile_options.  *
fd10: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
fd20: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
fd30: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
fd40: 6f 6e 73 20 75 73 65 64 20 69 6e 20 74 68 69 73  ons used in this
fd50: 20 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65   build,.  ** one
fd60: 20 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e   option per row.
fd70: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
fd80: 67 54 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54  gTyp_COMPILE_OPT
fd90: 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20  IONS: {.    int 
fda0: 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  i = 0;.    const
fdb0: 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
fdc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
fdd0: 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  1;.    while( (z
fde0: 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Opt = sqlite3_co
fdf0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
fe00: 69 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  i++))!=0 ){.    
fe10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
fe20: 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f  dString(v, 1, zO
fe30: 70 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pt);.      sqlit
fe40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fe50: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
fe60: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   1);.    }.    s
fe70: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
fe80: 6c 65 28 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65  le(v);.  }.  bre
fe90: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
fea0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
feb0: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
fec0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fed0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20  _OMIT_WAL.  /*. 
fee0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
fef0: 68 65 6d 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70  hema.]wal_checkp
ff00: 6f 69 6e 74 20 3d 20 70 61 73 73 69 76 65 7c 66  oint = passive|f
ff10: 75 6c 6c 7c 72 65 73 74 61 72 74 7c 74 72 75 6e  ull|restart|trun
ff20: 63 61 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  cate.  **.  ** C
ff30: 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61  heckpoint the da
ff40: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
ff50: 61 73 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f  ase PragTyp_WAL_
ff60: 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20  CHECKPOINT: {.  
ff70: 20 20 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64    int iBt = (pId
ff80: 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f  2->z?iDb:SQLITE_
ff90: 4d 41 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20  MAX_ATTACHED);. 
ffa0: 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53     int eMode = S
ffb0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ffc0: 5f 50 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66  _PASSIVE;.    if
ffd0: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
ffe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
fff0: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75  ICmp(zRight, "fu
10000 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
10010 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
10020 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
10030 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
10040 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
10050 70 28 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61  p(zRight, "resta
10060 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
10070 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
10080 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
10090 54 41 52 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TART;.      }els
100a0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
100b0 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 74 72  ICmp(zRight, "tr
100c0 75 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  uncate")==0 ){. 
100d0 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53         eMode = S
100e0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
100f0 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20  _TRUNCATE;.     
10100 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
10110 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20  rse->nMem = 3;. 
10120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10130 64 4f 70 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b  dOp3(v, OP_Check
10140 70 6f 69 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64  point, iBt, eMod
10150 65 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 1);.    sqlit
10160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10170 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
10180 20 33 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   3);.  }.  break
10190 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  ;..  /*.  **   P
101a0 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68  RAGMA wal_autoch
101b0 65 63 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20  eckpoint.  **   
101c0 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63  PRAGMA wal_autoc
101d0 68 65 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20  heckpoint = N.  
101e0 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72  **.  ** Configur
101f0 65 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  e a database con
10200 6e 65 63 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d  nection to autom
10210 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
10220 69 6e 74 20 61 20 64 61 74 61 62 61 73 65 0a 20  int a database. 
10230 20 2a 2a 20 61 66 74 65 72 20 61 63 63 75 6d 75   ** after accumu
10240 6c 61 74 69 6e 67 20 4e 20 66 72 61 6d 65 73 20  lating N frames 
10250 69 6e 20 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71  in the log. Or q
10260 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 75 72  uery for the cur
10270 72 65 6e 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20  rent value.  ** 
10280 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  of N..  */.  cas
10290 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 41 55  e PragTyp_WAL_AU
102a0 54 4f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a  TOCHECKPOINT: {.
102b0 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
102c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
102d0 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
102e0 6e 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74  nt(db, sqlite3At
102f0 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  oi(zRight));.   
10300 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
10310 67 6c 65 49 6e 74 28 76 2c 20 0a 20 20 20 20 20  gleInt(v, .     
10320 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
10330 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c 44 65  ck==sqlite3WalDe
10340 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20  faultHook ? .   
10350 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50          SQLITE_P
10360 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57  TR_TO_INT(db->pW
10370 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d  alArg) : 0);.  }
10380 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
10390 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
103a0 47 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72  GMA shrink_memor
103b0 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  y.  **.  ** IMPL
103c0 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
103d0 2d 32 33 34 34 35 2d 34 36 31 30 39 20 54 68 69  -23445-46109 Thi
103e0 73 20 70 72 61 67 6d 61 20 63 61 75 73 65 73 20  s pragma causes 
103f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
10400 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20  * connection on 
10410 77 68 69 63 68 20 69 74 20 69 73 20 69 6e 76 6f  which it is invo
10420 6b 65 64 20 74 6f 20 66 72 65 65 20 75 70 20 61  ked to free up a
10430 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
10440 20 69 74 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79   it.  ** can, by
10450 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
10460 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
10470 72 79 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ry()..  */.  cas
10480 65 20 50 72 61 67 54 79 70 5f 53 48 52 49 4e 4b  e PragTyp_SHRINK
10490 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73  _MEMORY: {.    s
104a0 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
104b0 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20  e_memory(db);.  
104c0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
104d0 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
104e0 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50  optimize.  **  P
104f0 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65 28 4d  RAGMA optimize(M
10500 41 53 4b 29 0a 20 20 2a 2a 20 20 50 52 41 47 4d  ASK).  **  PRAGM
10510 41 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a  A schema.optimiz
10520 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  e.  **  PRAGMA s
10530 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 28 4d  chema.optimize(M
10540 41 53 4b 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ASK).  **.  ** A
10550 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
10560 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ze the database.
10570 20 20 41 6c 6c 20 73 63 68 65 6d 61 73 20 61 72    All schemas ar
10580 65 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74  e optimized in t
10590 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
105a0 6f 20 66 6f 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c  o forms, and onl
105b0 79 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  y the specified 
105c0 73 63 68 65 6d 61 20 69 73 20 6f 70 74 69 6d 69  schema is optimi
105d0 7a 65 64 20 69 6e 20 74 68 65 20 6c 61 74 74 65  zed in the latte
105e0 72 20 74 77 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  r two..  **.  **
105f0 20 54 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20   The details of 
10600 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 70 65  optimizations pe
10610 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
10620 70 72 61 67 6d 61 20 61 72 65 20 65 78 70 65 63  pragma are expec
10630 74 65 64 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e  ted.  ** to chan
10640 67 65 20 61 6e 64 20 69 6d 70 72 6f 76 65 20 6f  ge and improve o
10650 76 65 72 20 74 69 6d 65 2e 20 20 41 70 70 6c 69  ver time.  Appli
10660 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 61  cations should a
10670 6e 74 69 63 69 70 61 74 65 20 74 68 61 74 0a 20  nticipate that. 
10680 20 2a 2a 20 74 68 69 73 20 70 72 61 67 6d 61 20   ** this pragma 
10690 77 69 6c 6c 20 70 65 72 66 6f 72 6d 20 6e 65 77  will perform new
106a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
106b0 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65  n future release
106c0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
106d0 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65   optional argume
106e0 6e 74 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  nt is a bitmask 
106f0 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
10700 20 74 6f 20 70 65 72 66 6f 72 6d 3a 0a 20 20 2a   to perform:.  *
10710 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 31  *.  **    0x0001
10720 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 6d 6f      Debugging mo
10730 64 65 2e 20 20 44 6f 20 6e 6f 74 20 61 63 74 75  de.  Do not actu
10740 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 61 6e 79  ally perform any
10750 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 20   optimizations. 
10760 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
10770 20 62 75 74 20 69 6e 73 74 65 61 64 20 72 65 74   but instead ret
10780 75 72 6e 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20  urn one line of 
10790 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 6f 70  text for each op
107a0 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  timization.  ** 
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
107c0 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  t would have bee
107d0 6e 20 64 6f 6e 65 2e 20 20 4f 66 66 20 62 79 20  n done.  Off by 
107e0 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20  default..  **.  
107f0 2a 2a 20 20 20 20 30 78 30 30 30 32 20 20 20 20  **    0x0002    
10800 52 75 6e 20 41 4e 41 4c 59 5a 45 20 6f 6e 20 74  Run ANALYZE on t
10810 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
10820 20 62 65 6e 65 66 69 74 2e 20 20 4f 6e 20 62 79   benefit.  On by
10830 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 20 20   default..  **  
10840 20 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20              See 
10850 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69  below for additi
10860 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
10870 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30  ..  **.  **    0
10880 78 30 30 30 34 20 20 20 20 28 4e 6f 74 20 79 65  x0004    (Not ye
10890 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 52  t implemented) R
108a0 65 63 6f 72 64 20 75 73 61 67 65 20 61 6e 64 20  ecord usage and 
108b0 70 65 72 66 6f 72 6d 61 6e 63 65 20 0a 20 20 2a  performance .  *
108c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
108d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
108e0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73  the current sess
108f0 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ion in the.  ** 
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
10910 61 62 61 73 65 20 66 69 6c 65 20 73 6f 20 74 68  abase file so th
10920 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61 76  at it will be av
10930 61 69 6c 61 62 6c 65 20 74 6f 20 22 6f 70 74 69  ailable to "opti
10940 6d 69 7a 65 22 0a 20 20 2a 2a 20 20 20 20 20 20  mize".  **      
10950 20 20 20 20 20 20 20 20 70 72 61 67 6d 61 73 20          pragmas 
10960 72 75 6e 20 62 79 20 66 75 74 75 72 65 20 64 61  run by future da
10970 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10980 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ns..  **.  **   
10990 20 30 78 30 30 30 38 20 20 20 20 28 4e 6f 74 20   0x0008    (Not 
109a0 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29  yet implemented)
109b0 20 43 72 65 61 74 65 20 69 6e 64 65 78 65 73 20   Create indexes 
109c0 74 68 61 74 20 6d 69 67 68 74 20 68 61 76 65 0a  that might have.
109d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
109e0 20 20 62 65 65 6e 20 68 65 6c 70 66 75 6c 20 74    been helpful t
109f0 6f 20 72 65 63 65 6e 74 20 71 75 65 72 69 65 73  o recent queries
10a00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
10a10 65 66 61 75 6c 74 20 4d 41 53 4b 20 69 73 20 61  efault MASK is a
10a20 6e 64 20 61 6c 77 61 79 73 20 73 68 61 6c 6c 20  nd always shall 
10a30 62 65 20 30 78 66 66 66 65 2e 20 20 30 78 66 66  be 0xfffe.  0xff
10a40 66 65 20 6d 65 61 6e 73 20 70 65 72 66 6f 72 6d  fe means perform
10a50 20 61 6c 6c 0a 20 20 2a 2a 20 6f 66 20 74 68 65   all.  ** of the
10a60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
10a70 69 73 74 65 64 20 61 62 6f 76 65 20 65 78 63 65  isted above exce
10a80 70 74 20 44 65 62 75 67 20 4d 6f 64 65 2c 20 69  pt Debug Mode, i
10a90 6e 63 6c 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a  ncluding new.  *
10aa0 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  * optimizations 
10ab0 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20 79 65  that have not ye
10ac0 74 20 62 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e  t been invented.
10ad0 20 20 49 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a    If new optimiz
10ae0 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20  ations are.  ** 
10af0 65 76 65 72 20 61 64 64 65 64 20 74 68 61 74 20  ever added that 
10b00 73 68 6f 75 6c 64 20 62 65 20 6f 66 66 20 62 79  should be off by
10b10 20 64 65 66 61 75 6c 74 2c 20 74 68 6f 73 65 20   default, those 
10b20 6f 66 66 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a  off-by-default .
10b30 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
10b40 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 62 69 74  ns will have bit
10b50 6d 61 73 6b 73 20 6f 66 20 30 78 31 30 30 30 30  masks of 0x10000
10b60 20 6f 72 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a   or larger..  **
10b70 0a 20 20 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54  .  ** DETERMINAT
10b80 49 4f 4e 20 4f 46 20 57 48 45 4e 20 54 4f 20 52  ION OF WHEN TO R
10b90 55 4e 20 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a  UN ANALYZE.  **.
10ba0 20 20 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72    ** In the curr
10bb0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
10bc0 6f 6e 2c 20 61 20 74 61 62 6c 65 20 69 73 20 61  on, a table is a
10bd0 6e 61 6c 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20  nalyzed if only 
10be0 69 66 20 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74  if all of.  ** t
10bf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
10c00 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
10c10 20 28 31 29 20 4d 41 53 4b 20 62 69 74 20 30 78   (1) MASK bit 0x
10c20 30 32 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a  02 is set..  **.
10c30 20 20 2a 2a 20 28 32 29 20 54 68 65 20 71 75 65    ** (2) The que
10c40 72 79 20 70 6c 61 6e 6e 65 72 20 75 73 65 64 20  ry planner used 
10c50 73 71 6c 69 74 65 5f 73 74 61 74 31 2d 73 74 79  sqlite_stat1-sty
10c60 6c 65 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  le statistics fo
10c70 72 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20  r one or.  **   
10c80 20 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f    more indexes o
10c90 66 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 73  f the table at s
10ca0 6f 6d 65 20 70 6f 69 6e 74 20 64 75 72 69 6e 67  ome point during
10cb0 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
10cc0 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 75  .  **     the cu
10cd0 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
10ce0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20  ..  **.  ** (3) 
10cf0 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65  One or more inde
10d00 78 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  xes of the table
10d10 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 75   are currently u
10d20 6e 61 6e 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a  nanalyzed OR.  *
10d30 2a 20 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72  *     the number
10d40 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
10d50 74 61 62 6c 65 20 68 61 73 20 69 6e 63 72 65 61  table has increa
10d60 73 65 64 20 62 79 20 32 35 20 74 69 6d 65 73 20  sed by 25 times 
10d70 6f 72 20 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20  or more.  **    
10d80 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20   since the last 
10d90 74 69 6d 65 20 41 4e 41 4c 59 5a 45 20 77 61 73  time ANALYZE was
10da0 20 72 75 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   run..  **.  ** 
10db0 54 68 65 20 72 75 6c 65 73 20 66 6f 72 20 77 68  The rules for wh
10dc0 65 6e 20 74 61 62 6c 65 73 20 61 72 65 20 61 6e  en tables are an
10dd0 61 6c 79 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c  alyzed are likel
10de0 79 20 74 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20  y to change in. 
10df0 20 2a 2a 20 66 75 74 75 72 65 20 72 65 6c 65 61   ** future relea
10e00 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ses..  */.  case
10e10 20 50 72 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a   PragTyp_OPTIMIZ
10e20 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  E: {.    int iDb
10e30 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
10e40 2f 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  /* Loop terminat
10e50 69 6f 6e 20 70 6f 69 6e 74 20 66 6f 72 20 74 68  ion point for th
10e60 65 20 73 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f  e schema loop */
10e70 0a 20 20 20 20 69 6e 74 20 69 54 61 62 43 75 72  .    int iTabCur
10e80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
10e90 75 72 73 6f 72 20 66 6f 72 20 61 20 74 61 62 6c  ursor for a tabl
10ea0 65 20 77 68 6f 73 65 20 73 69 7a 65 20 6e 65 65  e whose size nee
10eb0 64 73 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ds checking */. 
10ec0 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20     HashElem *k; 
10ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10ee0 70 20 6f 76 65 72 20 74 61 62 6c 65 73 20 6f 66  p over tables of
10ef0 20 61 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20   a schema */.   
10f00 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
10f10 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ;       /* The c
10f20 75 72 72 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f  urrent schema */
10f30 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
10f40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
10f50 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63   table in the sc
10f60 68 65 6d 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65  hema */.    Inde
10f70 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
10f80 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
10f90 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
10fa0 20 20 20 4c 6f 67 45 73 74 20 73 7a 54 68 72 65     LogEst szThre
10fb0 73 68 6f 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a  shold;    /* Siz
10fc0 65 20 74 68 72 65 73 68 6f 6c 64 20 61 62 6f 76  e threshold abov
10fd0 65 20 77 68 69 63 68 20 72 65 61 6e 61 6c 79 73  e which reanalys
10fe0 69 73 20 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20  is is needd */. 
10ff0 20 20 20 63 68 61 72 20 2a 7a 53 75 62 53 71 6c     char *zSubSql
11000 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ;         /* SQL
11010 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 74   statement for t
11020 68 65 20 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70  he OP_SqlExec op
11030 63 6f 64 65 20 2a 2f 0a 20 20 20 20 75 33 32 20  code */.    u32 
11040 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
11050 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70     /* Mask of op
11060 65 72 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66  erations to perf
11070 6f 72 6d 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  orm */..    if( 
11080 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
11090 6f 70 4d 61 73 6b 20 3d 20 28 75 33 32 29 73 71  opMask = (u32)sq
110a0 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
110b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70  );.      if( (op
110c0 4d 61 73 6b 20 26 20 30 78 30 32 29 3d 3d 30 20  Mask & 0x02)==0 
110d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
110e0 73 65 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  se{.      opMask
110f0 20 3d 20 30 78 66 66 66 65 3b 0a 20 20 20 20 7d   = 0xfffe;.    }
11100 0a 20 20 20 20 69 54 61 62 43 75 72 20 3d 20 70  .    iTabCur = p
11110 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
11120 20 20 20 66 6f 72 28 69 44 62 4c 61 73 74 20 3d     for(iDbLast =
11130 20 7a 44 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62   zDb?iDb:db->nDb
11140 2d 31 3b 20 69 44 62 3c 3d 69 44 62 4c 61 73 74  -1; iDb<=iDbLast
11150 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iDb++){.      
11160 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e  if( iDb==1 ) con
11170 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c  tinue;.      sql
11180 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
11190 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
111a0 29 3b 0a 20 20 20 20 20 20 70 53 63 68 65 6d 61  );.      pSchema
111b0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
111c0 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 66  pSchema;.      f
111d0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
111e0 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  irst(&pSchema->t
111f0 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71  blHash); k; k=sq
11200 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
11210 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
11220 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
11230 61 73 68 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20  ashData(k);..   
11240 20 20 20 20 20 2f 2a 20 49 66 20 74 61 62 6c 65       /* If table
11250 20 70 54 61 62 20 68 61 73 20 6e 6f 74 20 62 65   pTab has not be
11260 65 6e 20 75 73 65 64 20 69 6e 20 61 20 77 61 79  en used in a way
11270 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 6e 65   that would bene
11280 66 69 74 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  fit from.       
11290 20 2a 2a 20 68 61 76 69 6e 67 20 61 6e 61 6c 79   ** having analy
112a0 73 69 73 20 73 74 61 74 69 73 74 69 63 73 20 64  sis statistics d
112b0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
112c0 74 20 73 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  t session, then 
112d0 73 6b 69 70 20 69 74 2e 0a 20 20 20 20 20 20 20  skip it..       
112e0 20 2a 2a 20 54 68 69 73 20 61 6c 73 6f 20 68 61   ** This also ha
112f0 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
11300 73 6b 69 70 70 69 6e 67 20 76 69 72 74 75 61 6c  skipping virtual
11310 20 74 61 62 6c 65 73 20 61 6e 64 20 76 69 65 77   tables and view
11320 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
11330 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
11340 20 26 20 54 46 5f 53 74 61 74 73 55 73 65 64 29   & TF_StatsUsed)
11350 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
11360 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 6e  .        /* Rean
11370 61 6c 79 7a 65 20 69 66 20 74 68 65 20 74 61 62  alyze if the tab
11380 6c 65 20 69 73 20 32 35 20 74 69 6d 65 73 20 6c  le is 25 times l
11390 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
113a0 61 73 74 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a  ast analysis */.
113b0 20 20 20 20 20 20 20 20 73 7a 54 68 72 65 73 68          szThresh
113c0 6f 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  old = pTab->nRow
113d0 4c 6f 67 45 73 74 20 2b 20 34 36 3b 20 61 73 73  LogEst + 46; ass
113e0 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 67 45  ert( sqlite3LogE
113f0 73 74 28 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20  st(25)==46 );.  
11400 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
11410 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
11420 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
11430 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
11440 69 66 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74  if( !pIdx->hasSt
11450 61 74 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  at1 ){.         
11460 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d     szThreshold =
11470 20 30 3b 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e   0; /* Always an
11480 61 6c 79 7a 65 20 69 66 20 61 6e 79 20 69 6e 64  alyze if any ind
11490 65 78 20 6c 61 63 6b 73 20 73 74 61 74 69 73 74  ex lacks statist
114a0 69 63 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ics */.         
114b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
114c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
114d0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 54 68          if( szTh
114e0 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20  reshold ){.     
114f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
11500 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
11510 61 62 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62  abCur, iDb, pTab
11520 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
11530 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11540 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11550 50 5f 49 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61  P_IfSmaller, iTa
11560 62 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20  bCur, .         
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11590 6e 74 41 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d  ntAddr(v)+2+(opM
115a0 61 73 6b 26 31 29 2c 20 73 7a 54 68 72 65 73 68  ask&1), szThresh
115b0 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  old);.          
115c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
115d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
115e0 20 20 20 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c     zSubSql = sql
115f0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
11600 22 41 4e 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e  "ANALYZE \"%w\".
11610 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%w\"",.       
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
11640 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
11650 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
11660 20 20 20 20 20 20 20 69 66 28 20 6f 70 4d 61 73         if( opMas
11670 6b 20 26 20 30 78 30 31 20 29 7b 0a 20 20 20 20  k & 0x01 ){.    
11680 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
11690 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
116a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
116b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
116c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
116d0 6e 67 38 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a  ng8, 0, r1, 0, z
116e0 53 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d  SubSql, P4_DYNAM
116f0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  IC);.          s
11700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11710 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
11720 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
11730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11750 64 4f 70 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78  dOp4(v, OP_SqlEx
11760 65 63 2c 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75  ec, 0, 0, 0, zSu
11770 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43  bSql, P4_DYNAMIC
11780 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
117a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
117b0 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a  (v, OP_Expire);.
117c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
117d0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
117e0 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a  MA busy_timeout.
117f0 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75    **   PRAGMA bu
11800 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20  sy_timeout = N. 
11810 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71   **.  ** Call sq
11820 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
11830 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65 74 75  ut(db, N).  Retu
11840 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
11850 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a  imeout value.  *
11860 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65 74 2e  * if one is set.
11870 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68 61 6e    If no busy han
11880 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66 65 72  dler or a differ
11890 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ent busy handler
118a0 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 68 65   is set.  ** the
118b0 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  n 0 is returned.
118c0 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 62 75    Setting the bu
118d0 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30 20  sy_timeout to 0 
118e0 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a  or negative.  **
118f0 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 74 69   disables the ti
11900 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  meout..  */.  /*
11910 63 61 73 65 20 50 72 61 67 54 79 70 5f 42 55 53  case PragTyp_BUS
11920 59 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61  Y_TIMEOUT*/ defa
11930 75 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73 65 72  ult: {.    asser
11940 74 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61  t( pPragma->ePra
11950 67 54 79 70 3d 3d 50 72 61 67 54 79 70 5f 42 55  gTyp==PragTyp_BU
11960 53 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20  SY_TIMEOUT );.  
11970 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
11980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
11990 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 73  sy_timeout(db, s
119a0 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
119b0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t));.    }.    r
119c0 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
119d0 2c 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75  , db->busyTimeou
119e0 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
119f0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11a00 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70  PRAGMA soft_heap
11a10 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52  _limit.  **   PR
11a20 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c  AGMA soft_heap_l
11a30 69 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  imit = N.  **.  
11a40 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
11a50 4e 2d 4f 46 3a 20 52 2d 32 36 33 34 33 2d 34 35  N-OF: R-26343-45
11a60 39 33 30 20 54 68 69 73 20 70 72 61 67 6d 61 20  930 This pragma 
11a70 69 6e 76 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a  invokes the.  **
11a80 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
11a90 61 70 5f 6c 69 6d 69 74 36 34 28 29 20 69 6e 74  ap_limit64() int
11aa0 65 72 66 61 63 65 20 77 69 74 68 20 74 68 65 20  erface with the 
11ab0 61 72 67 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e  argument N, if N
11ac0 20 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69   is.  ** specifi
11ad0 65 64 20 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d  ed and is a non-
11ae0 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
11af0 2e 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  ..  ** IMPLEMENT
11b00 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35  ATION-OF: R-6445
11b10 31 2d 30 37 31 36 33 20 54 68 65 20 73 6f 66 74  1-07163 The soft
11b20 5f 68 65 61 70 5f 6c 69 6d 69 74 20 70 72 61 67  _heap_limit prag
11b30 6d 61 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72  ma always.  ** r
11b40 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20  eturns the same 
11b50 69 6e 74 65 67 65 72 20 74 68 61 74 20 77 6f 75  integer that wou
11b60 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ld be returned b
11b70 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  y the.  ** sqlit
11b80 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11b90 69 74 36 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75  it64(-1) C-langu
11ba0 61 67 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  age function..  
11bb0 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
11bc0 70 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49  p_SOFT_HEAP_LIMI
11bd0 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
11be0 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66  _int64 N;.    if
11bf0 28 20 7a 52 69 67 68 74 20 26 26 20 73 71 6c 69  ( zRight && sqli
11c00 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
11c10 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51  (zRight, &N)==SQ
11c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11c30 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
11c40 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20  ap_limit64(N);. 
11c50 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
11c60 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69  ingleInt(v, sqli
11c70 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
11c80 6d 69 74 36 34 28 2d 31 29 29 3b 0a 20 20 20 20  mit64(-1));.    
11c90 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11ca0 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
11cb0 68 72 65 61 64 73 0a 20 20 2a 2a 20 20 20 50 52  hreads.  **   PR
11cc0 41 47 4d 41 20 74 68 72 65 61 64 73 20 3d 20 4e  AGMA threads = N
11cd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69  .  **.  ** Confi
11ce0 67 75 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  gure the maximum
11cf0 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65   number of worke
11d00 72 20 74 68 72 65 61 64 73 2e 20 20 52 65 74 75  r threads.  Retu
11d10 72 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  rn the new.  ** 
11d20 6d 61 78 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d  maximum, which m
11d30 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
11d40 6e 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  n requested..  *
11d50 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
11d60 5f 54 48 52 45 41 44 53 3a 20 7b 0a 20 20 20 20  _THREADS: {.    
11d70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b  sqlite3_int64 N;
11d80 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 0a  .    if( zRight.
11d90 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 44       && sqlite3D
11da0 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
11db0 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45  ght, &N)==SQLITE
11dc0 5f 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30  _OK.     && N>=0
11dd0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
11de0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
11df0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
11e00 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 28 69 6e  KER_THREADS, (in
11e10 74 29 28 4e 26 30 78 37 66 66 66 66 66 66 66 29  t)(N&0x7fffffff)
11e20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
11e30 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
11e40 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
11e50 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  , SQLITE_LIMIT_W
11e60 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 2d  ORKER_THREADS, -
11e70 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
11e80 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
11e90 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
11ea0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
11eb0 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a  _TEST).  /*.  **
11ec0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
11ed0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 66 69 6c  ent state of fil
11ee0 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64  e logs for all d
11ef0 61 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20  atabases.  */.  
11f00 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43  case PragTyp_LOC
11f10 4b 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  K_STATUS: {.    
11f20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
11f30 72 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e  r *const azLockN
11f40 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ame[] = {.      
11f50 22 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61  "unlocked", "sha
11f60 72 65 64 22 2c 20 22 72 65 73 65 72 76 65 64 22  red", "reserved"
11f70 2c 20 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78  , "pending", "ex
11f80 63 6c 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a  clusive".    };.
11f90 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
11fa0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b  Parse->nMem = 2;
11fb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11fc0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
11fd0 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b       Btree *pBt;
11fe0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11ff0 72 20 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b  r *zState = "unk
12000 6e 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74  nown";.      int
12010 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62   j;.      if( db
12020 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
12030 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
12040 0a 20 20 20 20 20 20 70 42 74 20 3d 20 64 62 2d  .      pBt = db-
12050 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12060 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c     if( pBt==0 ||
12070 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
12080 65 72 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  er(pBt)==0 ){.  
12090 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 22        zState = "
120a0 63 6c 6f 73 65 64 22 3b 0a 20 20 20 20 20 20 7d  closed";.      }
120b0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
120c0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
120d0 2c 20 69 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d  , i ? db->aDb[i]
120e0 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a  .zDbSName : 0, .
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 20 20 20 20 53 51 4c 49 54 45 5f 46 43 4e 54       SQLITE_FCNT
12120 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29  L_LOCKSTATE, &j)
12130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12140 20 20 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d          zState =
12150 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a   azLockName[j];.
12160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12170 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
12180 61 64 28 76 2c 20 31 2c 20 22 73 73 22 2c 20 64  ad(v, 1, "ss", d
12190 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
121a0 6d 65 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20  me, zState);.   
121b0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
121c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
121d0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
121e0 43 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20 20 20  C.  /* Pragma   
121f0 20 20 20 20 20 69 41 72 67 0a 20 20 2a 2a 20 2d       iArg.  ** -
12200 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d  ---------   ----
12210 2d 2d 0a 20 20 2a 2a 20 20 6b 65 79 20 20 20 20  --.  **  key    
12220 20 20 20 20 20 20 20 30 0a 20 20 2a 2a 20 20 72         0.  **  r
12230 65 6b 65 79 20 20 20 20 20 20 20 20 20 31 0a 20  ekey         1. 
12240 20 2a 2a 20 20 68 65 78 6b 65 79 20 20 20 20 20   **  hexkey     
12250 20 20 20 32 0a 20 20 2a 2a 20 20 68 65 78 72 65     2.  **  hexre
12260 6b 65 79 20 20 20 20 20 20 33 0a 20 20 2a 2a 20  key      3.  ** 
12270 20 74 65 78 74 6b 65 79 20 20 20 20 20 20 20 34   textkey       4
12280 0a 20 20 2a 2a 20 20 74 65 78 74 72 65 6b 65 79  .  **  textrekey
12290 20 20 20 20 20 35 0a 20 20 2a 2f 0a 20 20 63 61       5.  */.  ca
122a0 73 65 20 50 72 61 67 54 79 70 5f 4b 45 59 3a 20  se PragTyp_KEY: 
122b0 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  {.    if( zRight
122c0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
122d0 42 75 66 5b 34 30 5d 3b 0a 20 20 20 20 20 20 63  Buf[40];.      c
122e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 20  onst char *zKey 
122f0 3d 20 7a 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = zRight;.      
12300 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28  int n;.      if(
12310 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3d 3d   pPragma->iArg==
12320 32 20 7c 7c 20 70 50 72 61 67 6d 61 2d 3e 69 41  2 || pPragma->iA
12330 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
12340 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20   u8 iByte;.     
12350 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
12360 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65    for(i=0, iByte
12370 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75  =0; i<sizeof(zBu
12380 66 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49  f)*2 && sqlite3I
12390 73 78 64 69 67 69 74 28 7a 52 69 67 68 74 5b 69  sxdigit(zRight[i
123a0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
123b0 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42 79      iByte = (iBy
123c0 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33  te<<4) + sqlite3
123d0 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68 74 5b  HexToInt(zRight[
123e0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  i]);.          i
123f0 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 42  f( (i&1)!=0 ) zB
12400 75 66 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  uf[i/2] = iByte;
12410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12420 20 20 20 7a 4b 65 79 20 3d 20 7a 42 75 66 3b 0a     zKey = zBuf;.
12430 20 20 20 20 20 20 20 20 6e 20 3d 20 69 2f 32 3b          n = i/2;
12440 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12450 20 20 20 20 20 20 6e 20 3d 20 70 50 72 61 67 6d        n = pPragm
12460 61 2d 3e 69 41 72 67 3c 34 20 3f 20 73 71 6c 69  a->iArg<4 ? sqli
12470 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67  te3Strlen30(zRig
12480 68 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20  ht) : -1;.      
12490 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 72  }.      if( (pPr
124a0 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 31 29 3d  agma->iArg & 1)=
124b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
124c0 20 3d 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76   = sqlite3_key_v
124d0 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c  2(db, zDb, zKey,
124e0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
124f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12500 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28  qlite3_rekey_v2(
12510 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 6e  db, zDb, zKey, n
12520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12530 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12540 4f 4b 20 26 26 20 6e 21 3d 30 20 29 7b 0a 20 20  OK && n!=0 ){.  
12550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12560 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31  eSetNumCols(v, 1
12570 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12580 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
12590 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 0, COLNAME_N
125a0 41 4d 45 2c 20 22 6f 6b 22 2c 20 53 51 4c 49 54  AME, "ok", SQLIT
125b0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
125c0 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
125d0 65 78 74 28 76 2c 20 22 6f 6b 22 29 3b 0a 20 20  ext(v, "ok");.  
125e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
125f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
12600 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
12610 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
12620 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
12630 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a  E_ENABLE_CEROD).
12640 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
12650 43 54 49 56 41 54 45 5f 45 58 54 45 4e 53 49 4f  CTIVATE_EXTENSIO
12660 4e 53 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  NS: if( zRight )
12670 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12680 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
12690 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
126a0 70 28 7a 52 69 67 68 74 2c 20 22 73 65 65 2d 22  p(zRight, "see-"
126b0 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
126c0 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
126d0 65 5f 73 65 65 28 26 7a 52 69 67 68 74 5b 34 5d  e_see(&zRight[4]
126e0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
126f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12700 41 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20 69  ABLE_CEROD.    i
12710 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
12720 6d 70 28 7a 52 69 67 68 74 2c 20 22 63 65 72 6f  mp(zRight, "cero
12730 64 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20  d-", 6)==0 ){.  
12740 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69      sqlite3_acti
12750 76 61 74 65 5f 63 65 72 6f 64 28 26 7a 52 69 67  vate_cerod(&zRig
12760 68 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ht[6]);.    }.#e
12770 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ndif.  }.  break
12780 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a  ;.#endif..  } /*
12790 20 45 6e 64 20 6f 66 20 74 68 65 20 50 52 41 47   End of the PRAG
127a0 4d 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20  MA switch */..  
127b0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
127c0 20 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f   block is a no-o
127d0 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
127e0 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
127f0 2e 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  . Its only.  ** 
12800 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 78  purpose is to ex
12810 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
12820 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 76 65 72  tatements to ver
12830 69 66 79 20 74 68 61 74 20 69 66 20 74 68 65 0a  ify that if the.
12840 20 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43    ** PragFlg_NoC
12850 6f 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69 73 20  olumns1 flag is 
12860 73 65 74 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  set and the call
12870 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20  er specified an 
12880 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f  argument.  ** to
12890 20 74 68 65 20 50 52 41 47 4d 41 2c 20 74 68 65   the PRAGMA, the
128a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
128b0 68 61 73 20 6e 6f 74 20 61 64 64 65 64 20 61 6e  has not added an
128c0 79 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a  y OP_ResultRow .
128d0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
128e0 73 20 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f  s to the VM.  */
128f0 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
12900 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
12910 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20  Flg_NoColumns1) 
12920 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  && zRight ){.   
12930 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
12940 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76 29  fyNoResultRow(v)
12950 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75  ;.  }..pragma_ou
12960 74 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  t:.  sqlite3DbFr
12970 65 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20  ee(db, zLeft);. 
12980 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12990 62 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69  b, zRight);.}.#i
129a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
129b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
129c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
12a10 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
12a20 6f 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  of an eponymous 
12a30 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
12a40 61 74 20 72 75 6e 73 20 61 20 70 72 61 67 6d 61  at runs a pragma
12a50 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ..**.*/.typedef 
12a60 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12a70 62 20 50 72 61 67 6d 61 56 74 61 62 3b 0a 74 79  b PragmaVtab;.ty
12a80 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
12a90 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 50 72  gmaVtabCursor Pr
12aa0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 3b 0a  agmaVtabCursor;.
12ab0 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
12ac0 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
12ad0 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
12ae0 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20  /* Base class.  
12af0 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f  Must be first */
12b00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
12b30 6e 65 63 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  nection to which
12b40 20 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20   it belongs */. 
12b50 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
12b60 65 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61  e *pName;  /* Na
12b70 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61  me of the pragma
12b80 20 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64 65 6e   */.  u8 nHidden
12b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ba0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64  /* Number of hid
12bb0 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  den columns */. 
12bc0 20 75 38 20 69 48 69 64 64 65 6e 3b 20 20 20 20   u8 iHidden;    
12bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12be0 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
12bf0 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a   hidden column *
12c00 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72 61 67  /.};.struct Prag
12c10 6d 61 56 74 61 62 43 75 72 73 6f 72 20 7b 0a 20  maVtabCursor {. 
12c20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
12c30 72 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42 61  rsor base; /* Ba
12c40 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20  se class.  Must 
12c50 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
12c60 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61  lite3_stmt *pPra
12c70 67 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  gma;    /* The p
12c80 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 20  ragma statement 
12c90 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69  to run */.  sqli
12ca0 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b  te_int64 iRowid;
12cb0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
12cc0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72   rowid */.  char
12cd0 20 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20   *azArg[2];     
12ce0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
12cf0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61  f the argument a
12d00 6e 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a  nd schema */.};.
12d10 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
12d20 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
12d30 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74  ule xConnect met
12d40 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
12d50 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e  nt pragmaVtabCon
12d60 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  nect(.  sqlite3 
12d70 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
12d80 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
12d90 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
12da0 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
12db0 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
12dc0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
12dd0 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
12de0 4e 61 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d 20  Name *pPragma = 
12df0 28 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d  (const PragmaNam
12e00 65 2a 29 70 41 75 78 3b 0a 20 20 50 72 61 67 6d  e*)pAux;.  Pragm
12e10 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 30 3b  aVtab *pTab = 0;
12e20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
12e30 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 53   i, j;.  char cS
12e40 65 70 20 3d 20 27 28 27 3b 0a 20 20 53 74 72 41  ep = '(';.  StrA
12e50 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72  ccum acc;.  char
12e60 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55   zBuf[200];..  U
12e70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12e80 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
12e90 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b  PARAMETER(argv);
12ea0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
12eb0 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20  umInit(&acc, 0, 
12ec0 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75  zBuf, sizeof(zBu
12ed0 66 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  f), 0);.  sqlite
12ee0 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
12ef0 26 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41  &acc, "CREATE TA
12f00 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69  BLE x");.  for(i
12f10 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69  =0, j=pPragma->i
12f20 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72  PragCName; i<pPr
12f30 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
12f40 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
12f50 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
12f60 65 6e 64 66 28 26 61 63 63 2c 20 22 25 63 5c 22  endf(&acc, "%c\"
12f70 25 73 5c 22 22 2c 20 63 53 65 70 2c 20 70 72 61  %s\"", cSep, pra
12f80 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20  gCName[j]);.    
12f90 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a  cSep = ',';.  }.
12fa0 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
12fb0 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
12fc0 70 65 6e 64 66 28 26 61 63 63 2c 20 22 28 5c 22  pendf(&acc, "(\"
12fd0 25 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e  %s\"", pPragma->
12fe0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 2b 2b 3b  zName);.    i++;
12ff0 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  .  }.  j = 0;.  
13000 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
13010 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
13020 52 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73  Result1 ){.    s
13030 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
13040 64 61 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72 67  dall(&acc, ",arg
13050 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a   HIDDEN");.    j
13060 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ++;.  }.  if( pP
13070 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
13080 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68 65 6d  & (PragFlg_Schem
13090 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53 63 68  aOpt|PragFlg_Sch
130a0 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20 20 73  emaReq) ){.    s
130b0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
130c0 64 61 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63 68  dall(&acc, ",sch
130d0 65 6d 61 20 48 49 44 44 45 4e 22 29 3b 0a 20 20  ema HIDDEN");.  
130e0 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c    j++;.  }.  sql
130f0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
13100 26 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &acc, ")", 1);. 
13110 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
13120 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20  Finish(&acc);.  
13130 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
13140 42 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42  Buf) < sizeof(zB
13150 75 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20  uf)-1 );.  rc = 
13160 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
13170 76 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a  vtab(db, zBuf);.
13180 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13190 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20  _OK ){.    pTab 
131a0 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73  = (PragmaVtab*)s
131b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
131c0 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29  zeof(PragmaVtab)
131d0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
131e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
131f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13210 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20  memset(pTab, 0, 
13220 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61  sizeof(PragmaVta
13230 62 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  b));.      pTab-
13240 3e 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61  >pName = pPragma
13250 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62  ;.      pTab->db
13260 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61   = db;.      pTa
13270 62 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a  b->iHidden = i;.
13280 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64        pTab->nHid
13290 64 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20  den = j;.    }. 
132a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45   }else{.    *pzE
132b0 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
132c0 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
132d0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
132e0 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d    }..  *ppVtab =
132f0 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
13300 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTab;.  return r
13310 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61  c;.}../* .** Pra
13320 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
13330 65 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e  e module xDiscon
13340 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nect method..*/.
13350 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13360 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  aVtabDisconnect(
13370 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
13380 74 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  tab){.  PragmaVt
13390 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
133a0 6d 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20  maVtab*)pVtab;. 
133b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
133c0 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
133d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46  LITE_OK;.}../* F
133e0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 65  igure out the be
133f0 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
13400 74 6f 20 73 65 61 72 63 68 20 61 20 70 72 61 67  to search a prag
13410 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
13430 65 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79  e not really any
13440 20 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20   index choices. 
13450 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
13460 65 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a  encourage the.**
13470 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74   query planner t
13480 6f 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72  o give == constr
13490 61 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79  aints on as many
134a0 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65   hidden paramete
134b0 72 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  rs as.** possibl
134c0 65 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c  e, and especiall
134d0 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68  y on the first h
134e0 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e  idden parameter.
134f0 20 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a    So return a.**
13500 20 68 69 67 68 20 63 6f 73 74 20 69 66 20 68 69   high cost if hi
13510 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20  dden parameters 
13520 61 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65  are unconstraine
13530 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13540 20 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49   pragmaVtabBestI
13550 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
13560 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
13570 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
13580 49 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56  Info){.  PragmaV
13590 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
135a0 67 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20  gmaVtab*)tab;.  
135b0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
135c0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
135d0 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
135e0 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  nt;.  int i, j;.
135f0 20 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a    int seen[2];..
13600 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
13610 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
13620 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61  ble)1;.  if( pTa
13630 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b  b->nHidden==0 ){
13640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13650 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69  K; }.  pConstrai
13660 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  nt = pIdxInfo->a
13670 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65  Constraint;.  se
13680 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65  en[0] = 0;.  see
13690 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  n[1] = 0;.  for(
136a0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
136b0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
136c0 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b  +, pConstraint++
136d0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  ){.    if( pCons
136e0 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d  traint->usable==
136f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13700 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
13710 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e  t->op!=SQLITE_IN
13720 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
13730 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  Q ) continue;.  
13740 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
13750 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61  t->iColumn < pTa
13760 62 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e  b->iHidden ) con
13770 74 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70  tinue;.    j = p
13780 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
13790 75 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64  umn - pTab->iHid
137a0 64 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  den;.    assert(
137b0 20 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65   j < 2 );.    se
137c0 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d  en[j] = i+1;.  }
137d0 0a 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d  .  if( seen[0]==
137e0 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  0 ){.    pIdxInf
137f0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
13800 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34   = (double)21474
13810 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49  83647;.    pIdxI
13820 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
13830 77 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b  ws = 2147483647;
13840 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13850 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d  TE_OK;.  }.  j =
13860 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49   seen[0]-1;.  pI
13870 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
13880 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76  intUsage[j].argv
13890 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64  Index = 1;.  pId
138a0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
138b0 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20  ntUsage[j].omit 
138c0 3d 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b  = 1;.  if( seen[
138d0 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  1]==0 ) return S
138e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78  QLITE_OK;.  pIdx
138f0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
13900 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30  ost = (double)20
13910 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
13920 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30  timatedRows = 20
13930 3b 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d  ;.  j = seen[1]-
13940 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
13950 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
13960 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32  j].argvIndex = 2
13970 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
13980 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
13990 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65  ].omit = 1;.  re
139a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
139b0 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  }../* Create a n
139c0 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
139d0 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
139e0 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63   table */.static
139f0 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f   int pragmaVtabO
13a00 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
13a10 20 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33   *pVtab, sqlite3
13a20 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
13a30 70 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  pCursor){.  Prag
13a40 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13a50 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72  sr;.  pCsr = (Pr
13a60 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13a70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
13a80 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20  izeof(*pCsr));. 
13a90 20 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72   if( pCsr==0 ) r
13aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13ab0 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73  EM;.  memset(pCs
13ac0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  r, 0, sizeof(Pra
13ad0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b  gmaVtabCursor));
13ae0 0a 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  .  pCsr->base.pV
13af0 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a  tab = pVtab;.  *
13b00 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72  ppCursor = &pCsr
13b10 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e  ->base;.  return
13b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13b30 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74  * Clear all cont
13b40 65 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20  ent from pragma 
13b50 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
13b60 72 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20  rsor. */.static 
13b70 76 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62 43  void pragmaVtabC
13b80 75 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d  ursorClear(Pragm
13b90 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13ba0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  r){.  int i;.  s
13bb0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13bc0 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
13bd0 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13be0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
13bf0 69 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72  i<ArraySize(pCsr
13c00 2d 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a  ->azArg); i++){.
13c10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13c20 28 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29  (pCsr->azArg[i])
13c30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72  ;.    pCsr->azAr
13c40 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  g[i] = 0;.  }.}.
13c50 0a 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67  ./* Close a prag
13c60 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13c70 20 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69   cursor */.stati
13c80 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
13c90 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74  Close(sqlite3_vt
13ca0 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
13cb0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13cc0 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13cd0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63  gmaVtabCursor*)c
13ce0 75 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62  ur;.  pragmaVtab
13cf0 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72  CursorClear(pCsr
13d00 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13d10 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
13d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13d30 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70  /* Advance the p
13d40 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
13d50 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  ble cursor to th
13d60 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74  e next row */.st
13d70 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
13d80 74 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  tabNext(sqlite3_
13d90 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
13da0 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  abCursor){.  Pra
13db0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13dc0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13dd0 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
13de0 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rsor;.  int rc =
13df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
13e00 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
13e10 78 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a  xRowid value */.
13e20 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b    pCsr->iRowid++
13e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
13e40 2d 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69  ->pPragma );.  i
13e50 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73  f( SQLITE_ROW!=s
13e60 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72  qlite3_step(pCsr
13e70 2d 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20  ->pPragma) ){.  
13e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
13e90 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
13ea0 72 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72  ragma);.    pCsr
13eb0 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20  ->pPragma = 0;. 
13ec0 20 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72     pragmaVtabCur
13ed0 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
13ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13ef0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d  .}../* .** Pragm
13f00 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13f10 6d 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d  module xFilter m
13f20 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13f30 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46   int pragmaVtabF
13f40 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
13f50 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
13f60 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
13f70 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
13f80 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
13f90 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
13fa0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
13fb0 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13fc0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
13fd0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
13fe0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50  pVtabCursor;.  P
13ff0 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
14000 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28  = (PragmaVtab*)(
14010 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
14020 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ab);.  int rc;. 
14030 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72   int i, j;.  Str
14040 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61  Accum acc;.  cha
14050 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53  r *zSql;..  UNUS
14060 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78  ED_PARAMETER(idx
14070 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Num);.  UNUSED_P
14080 41 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29  ARAMETER(idxStr)
14090 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75  ;.  pragmaVtabCu
140a0 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b  rsorClear(pCsr);
140b0 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e  .  j = (pTab->pN
140c0 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  ame->mPragFlg & 
140d0 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29  PragFlg_Result1)
140e0 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66  !=0 ? 0 : 1;.  f
140f0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
14100 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 63  i++, j++){.    c
14110 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
14120 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
14130 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14140 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
14150 20 61 73 73 65 72 74 28 20 6a 3c 41 72 72 61 79   assert( j<Array
14160 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  Size(pCsr->azArg
14170 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
14180 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d   pCsr->azArg[j]=
14190 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  =0 );.    if( zT
141a0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 73  ext ){.      pCs
141b0 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71  r->azArg[j] = sq
141c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
141d0 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20  s", zText);.    
141e0 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
141f0 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  g[j]==0 ){.     
14200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14210 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
14220 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14230 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
14240 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70  &acc, 0, 0, 0, p
14250 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Tab->db->aLimit[
14260 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
14270 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c  _LENGTH]);.  sql
14280 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
14290 6c 6c 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41  ll(&acc, "PRAGMA
142a0 20 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d   ");.  if( pCsr-
142b0 3e 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20  >azArg[1] ){.   
142c0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
142d0 65 6e 64 66 28 26 61 63 63 2c 20 22 25 51 2e 22  endf(&acc, "%Q."
142e0 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  , pCsr->azArg[1]
142f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14300 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
14310 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65  acc, pTab->pName
14320 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
14330 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29  pCsr->azArg[0] )
14340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
14350 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c 20  r_appendf(&acc, 
14360 22 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41  "=%Q", pCsr->azA
14370 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53  rg[0]);.  }.  zS
14380 71 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  ql = sqlite3StrA
14390 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29  ccumFinish(&acc)
143a0 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
143b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
143c0 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71  NOMEM;.  rc = sq
143d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
143e0 28 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  (pTab->db, zSql,
143f0 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61   -1, &pCsr->pPra
14400 67 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  gma, 0);.  sqlit
14410 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
14420 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14430 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  OK ){.    pTab->
14440 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73  base.zErrMsg = s
14450 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14460 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
14470 6d 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a  msg(pTab->db));.
14480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14490 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67   }.  return prag
144a0 6d 61 56 74 61 62 4e 65 78 74 28 70 56 74 61 62  maVtabNext(pVtab
144b0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
144c0 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
144d0 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45   table module xE
144e0 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  of method..*/.st
144f0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
14500 74 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76  tabEof(sqlite3_v
14510 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
14520 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  bCursor){.  Prag
14530 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
14540 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
14550 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
14560 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  sor;.  return (p
14570 43 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29  Csr->pPragma==0)
14580 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c  ;.}../* The xCol
14590 75 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c  umn method simpl
145a0 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  y returns the co
145b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  rresponding colu
145c0 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50  mn from.** the P
145d0 52 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74  RAGMA.  .*/.stat
145e0 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
145f0 62 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74  bColumn(.  sqlit
14600 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
14610 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
14620 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
14630 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29  *ctx, .  int i.)
14640 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
14650 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
14660 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
14670 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50  pVtabCursor;.  P
14680 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
14690 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28  = (PragmaVtab*)(
146a0 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
146b0 61 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61  ab);.  if( i<pTa
146c0 62 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20  b->iHidden ){.  
146d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
146e0 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
146f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
14700 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20  (pCsr->pPragma, 
14710 69 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i));.  }else{.  
14720 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14730 5f 74 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d  _text(ctx, pCsr-
14740 3e 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69  >azArg[i-pTab->i
14750 48 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54  Hidden],-1,SQLIT
14760 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14770 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14780 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  E_OK;.}../* .** 
14790 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
147a0 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77  able module xRow
147b0 69 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  id method..*/.st
147c0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
147d0 74 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33  tabRowid(sqlite3
147e0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
147f0 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74  tabCursor, sqlit
14800 65 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50  e_int64 *p){.  P
14810 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
14820 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56  *pCsr = (PragmaV
14830 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62  tabCursor*)pVtab
14840 43 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70  Cursor;.  *p = p
14850 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72  Csr->iRowid;.  r
14860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14870 0a 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d  .}../* The pragm
14880 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
14890 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63  object */.static
148a0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
148b0 6f 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62  odule pragmaVtab
148c0 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20  Module = {.  0, 
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
148f0 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  rsion */.  0,   
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
14920 74 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61  te - create a ta
14930 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ble */.  pragmaV
14940 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  tabConnect,     
14950 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
14960 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61  t - connect to a
14970 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
14980 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
14990 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
149a0 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78     /* xBestIndex
149b0 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61   - Determine sea
149c0 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a  rch strategy */.
149d0 20 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63    pragmaVtabDisc
149e0 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f  onnect,        /
149f0 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20  * xDisconnect - 
14a00 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20  Disconnect from 
14a10 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  a table */.  0, 
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
14a40 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74  stroy - Drop a t
14a50 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61  able */.  pragma
14a60 56 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20  VtabOpen,       
14a70 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
14a80 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
14a90 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
14aa0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
14ab0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
14ac0 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
14ad0 20 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74    pragmaVtabFilt
14ae0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
14af0 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66  * xFilter - conf
14b00 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74  igure scan const
14b10 72 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67  raints */.  prag
14b20 6d 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20  maVtabNext,     
14b30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
14b40 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
14b50 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
14b60 56 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20  VtabEof,        
14b70 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a         /* xEof *
14b80 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f  /.  pragmaVtabCo
14b90 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
14ba0 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65   /* xColumn - re
14bb0 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61  ad data */.  pra
14bc0 67 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20  gmaVtabRowid,   
14bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
14be0 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
14bf0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77    /* xUpdate - w
14c20 72 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30  rite data */.  0
14c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14c50 42 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72  Begin - begin tr
14c60 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
14c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14c90 53 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e  Sync - sync tran
14ca0 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
14cd0 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72  mmit - commit tr
14ce0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
14cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14d10 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62  Rollback - rollb
14d20 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
14d30 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d50 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
14d60 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76  on - function ov
14d70 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30  erloading */.  0
14d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14da0 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20  Rename - rename 
14db0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30  the table */.  0
14dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14de0 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
14df0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14e10 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20  Release */.  0, 
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
14e40 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20 20 30 20  llbackTo */.  0 
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
14e70 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a  hadowName */.};.
14e80 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
14e90 73 65 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20  see if zTabName 
14ea0 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61  is really the na
14eb0 6d 65 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20  me of a pragma. 
14ec0 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68   If it is,.** th
14ed0 65 6e 20 72 65 67 69 73 74 65 72 20 61 6e 20 65  en register an e
14ee0 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
14ef0 20 74 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20   table for that 
14f00 70 72 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72  pragma and retur
14f10 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
14f20 6f 20 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a  o the Module obj
14f30 65 63 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ect for the new 
14f40 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14f50 2f 0a 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65  /.Module *sqlite
14f60 33 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73  3PragmaVtabRegis
14f70 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ter(sqlite3 *db,
14f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14f90 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61  me){.  const Pra
14fa0 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a  gmaName *pName;.
14fb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14fc0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65  3_strnicmp(zName
14fd0 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d  , "pragma_", 7)=
14fe0 3d 30 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20  =0 );.  pName = 
14ff0 70 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61  pragmaLocate(zNa
15000 6d 65 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61  me+7);.  if( pNa
15010 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
15020 3b 0a 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e  ;.  if( (pName->
15030 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67  mPragFlg & (Prag
15040 46 6c 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67  Flg_Result0|Prag
15050 46 6c 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30  Flg_Result1))==0
15060 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
15070 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61  ssert( sqlite3Ha
15080 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
15090 75 6c 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ule, zName)==0 )
150a0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
150b0 65 33 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75  e3VtabCreateModu
150c0 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70  le(db, zName, &p
150d0 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c  ragmaVtabModule,
150e0 20 28 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30   (void*)pName, 0
150f0 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
15100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15110 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e  UALTABLE */..#en
15120 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
15130 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a           IT_PRAGMA */.