/ Hex Artifact Content
Login

Artifact 6c1383a5890914a339fde1b88607b06b089dc7b5f77348f6c53cc3242f09e44f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 2c 20 22 77 61 6c 32 22 0a  , "wal", "wal2".
2060: 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 61 73  #endif.  };.  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 44 45 4c 45 54 45 3d 3d  NALMODE_DELETE==
2090: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
20a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20b0: 5f 50 45 52 53 49 53 54 3d 3d 31 20 29 3b 0a 20  _PERSIST==1 );. 
20c0: 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
20d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3d 3d  OURNALMODE_OFF==
20e0: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  2 );.  assert( P
20f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2100: 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
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 4d 45 4d 4f  JOURNALMODE_MEMO
2130: 52 59 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  RY==4 );.  asser
2140: 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
2150: 4d 4f 44 45 5f 57 41 4c 3d 3d 35 20 29 3b 0a 20  MODE_WAL==5 );. 
2160: 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
2170: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 3d  OURNALMODE_WAL2=
2180: 3d 36 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =6 );.  assert( 
2190: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
21a0: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
21b0: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
21c0: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
21d0: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
21e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21f0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
2200: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
2210: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
2220: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
2230: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
2240: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2250: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2260: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2270: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2280: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2290: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
22a0: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
22b0: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
22c0: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
22d0: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
22e0: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2300: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
2310: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
2320: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
2330: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
2340: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2350: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2360: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2370: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2380: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2390: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
23a0: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
23b0: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
23c0: 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75 74  * Helper subrout
23d0: 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20 69  ine for PRAGMA i
23e0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a 0a  ntegrity_check:.
23f0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  **.** Generate c
2400: 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61 20  ode to output a 
2410: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72 65  single-column re
2420: 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61 20  sult row with a 
2430: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
2440: 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20 72  string held in r
2450: 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63 72  egister 3.  Decr
2460: 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74  ement the result
2470: 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73 74   count in regist
2480: 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c 74  er 1.** and halt
2490: 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   if the maximum 
24a0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
24b0: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
24c0: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
24d0: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24e0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24f0: 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61 64  be *v){.  int ad
2500: 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dr;.  sqlite3Vdb
2510: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
2520: 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a  sultRow, 3, 1);.
2530: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2540: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2550: 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69 74  _IfPos, 1, sqlit
2560: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2570: 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56 64  r(v)+2, 1);.  Vd
2580: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25a0: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
25b0: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
25c0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
25d0: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
25e0: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
25f0: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
2600: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
2610: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
2620: 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a  ]id [= value].**
2630: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
2640: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
2650: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
2660: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
2670: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
2680: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
2690: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
26a0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
26b0: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
26c0: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
26d0: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
26e0: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
26f0: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
2700: 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69  e is "database.i
2710: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
2720: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
2730: 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73  e.** and pId2 is
2740: 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65   the id.  If the
2750: 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75   left side is ju
2760: 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64  st "id" then pId
2770: 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61  1 is the.** id a
2780: 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65  nd pId2 is any e
2790: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
27a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67  void sqlite3Prag
27b0: 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ma(.  Parse *pPa
27c0: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
27d0: 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  Id1,        /* F
27e0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73 63  irst part of [sc
27f0: 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a  hema.]id field *
2800: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c  /.  Token *pId2,
2810: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
2820: 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  d part of [schem
2830: 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20  a.]id field, or 
2840: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
2850: 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a  *pValue,      /*
2860: 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75   Token for <valu
2870: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2880: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20 20   int minusFlag  
2890: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
28a0: 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63 65  a '-' sign prece
28b0: 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29  ded <value> */.)
28c0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20  {.  char *zLeft 
28d0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
28e0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28f0: 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a  -8 string <id> *
2900: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  /.  char *zRight
2910: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
2920: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
2930: 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65  -8 string <value
2940: 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  >, or NULL */.  
2950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
2960: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  = 0;   /* The da
2970: 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
2980: 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20   Token *pId;    
2990: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
29a0: 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e  er to <id> token
29b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63 6e   */.  char *aFcn
29c0: 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20  tl[4];       /* 
29d0: 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49  Argument to SQLI
29e0: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
29f0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a10: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66 6f  atabase index fo
2a20: 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a  r <database> */.
2a30: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a50: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * return value f
2a60: 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  orm SQLITE_FCNTL
2a70: 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c  _PRAGMA */.  sql
2a80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2a90: 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65  e->db;    /* The
2aa0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2ab0: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2ac0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2ad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
2ae0: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
2af0: 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a  being pragmaed *
2b00: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
2b10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2b20: 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72  rse);  /* Prepar
2b30: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
2b40: 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
2b50: 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f  me *pPragma;   /
2b60: 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  * The pragma */.
2b70: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2b80: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
2b90: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76  dbeRunOnlyOnce(v
2ba0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
2bb0: 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74  m = 2;..  /* Int
2bc0: 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68 65  erpret the [sche
2bd0: 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68 65  ma.] part of the
2be0: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
2bf0: 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20 20  t. iDb is the.  
2c00: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
2c10: 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70 72  database this pr
2c20: 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61 70  agma is being ap
2c30: 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e 61  plied to in db.a
2c40: 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d  Db[]. */.  iDb =
2c50: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
2c60: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64 31  ame(pParse, pId1
2c70: 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a 20  , pId2, &pId);. 
2c80: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
2c90: 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  urn;.  pDb = &db
2ca0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f  ->aDb[iDb];..  /
2cb0: 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64 61  * If the temp da
2cc0: 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
2cd0: 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64  explicitly named
2ce0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2cf0: 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61  .  ** pragma, ma
2d00: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f 70  ke sure it is op
2d10: 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  en. .  */.  if( 
2d20: 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  iDb==1 && sqlite
2d30: 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
2d40: 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  e(pParse) ){.   
2d50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2d60: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 4e  zLeft = sqlite3N
2d70: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2d80: 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c   pId);.  if( !zL
2d90: 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  eft ) return;.  
2da0: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
2db0: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2dc0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2dd0: 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29 3b   "-%T", pValue);
2de0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
2df0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e 61  ight = sqlite3Na
2e00: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
2e10: 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  pValue);.  }..  
2e20: 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b 0a  assert( pId2 );.
2e30: 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e    zDb = pId2->n>
2e40: 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  0 ? pDb->zDbSNam
2e50: 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  e : 0;.  if( sql
2e60: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2e70: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41  arse, SQLITE_PRA
2e80: 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67  GMA, zLeft, zRig
2e90: 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ht, zDb) ){.    
2ea0: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
2eb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20  .  }..  /* Send 
2ec0: 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  an SQLITE_FCNTL_
2ed0: 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74  PRAGMA file-cont
2ee0: 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65 72  rol to the under
2ef0: 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63  lying VFS.  ** c
2f00: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 69  onnection.  If i
2f10: 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
2f20: 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  _OK, then assume
2f30: 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20 20   that the VFS.  
2f40: 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20 70  ** handled the p
2f50: 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72 61  ragma and genera
2f60: 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61  te a no-op prepa
2f70: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
2f80: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2f90: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32  NTATION-OF: R-12
2fa0: 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65 76  238-55120 Whenev
2fb0: 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61 74  er a PRAGMA stat
2fc0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
2fd0: 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f  .  ** an SQLITE_
2fe0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c  FCNTL_PRAGMA fil
2ff0: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e  e control is sen
3000: 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73 71  t to the open sq
3010: 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20  lite3_file.  ** 
3020: 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
3030: 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ding to the data
3040: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68 69  base file to whi
3050: 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20 20  ch the pragma.  
3060: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66  ** statement ref
3070: 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ers..  **.  ** I
3080: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
3090: 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38 20  : R-29875-31678 
30a0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
30b0: 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
30c0: 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c  _PRAGMA.  ** fil
30d0: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20  e control is an 
30e0: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
30f0: 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63 68  s to strings (ch
3100: 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20 74  ar**) in which t
3110: 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65  he.  ** second e
3120: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72  lement of the ar
3130: 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ray is the name 
3140: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e  of the pragma an
3150: 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a 2a  d the third.  **
3160: 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
3170: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3180: 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69  pragma or NULL i
3190: 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61 73  f the pragma has
31a0: 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e   no.  ** argumen
31b0: 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c  t..  */.  aFcntl
31c0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74  [0] = 0;.  aFcnt
31d0: 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  l[1] = zLeft;.  
31e0: 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67  aFcntl[2] = zRig
31f0: 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20  ht;.  aFcntl[3] 
3200: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
3210: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
3220: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3230: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
3240: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
3250: 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69  NTL_PRAGMA, (voi
3260: 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66  d*)aFcntl);.  if
3270: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3280: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
3290: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
32a0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
32b0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
32c0: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
32d0: 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c  , aFcntl[0], SQL
32e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
32f0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
3300: 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30  Text(v, aFcntl[0
3310: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
3320: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
3330: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
3340: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
3350: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
3360: 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 61  UND ){.    if( a
3370: 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  Fcntl[0] ){.    
3380: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3390: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
33a0: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
33c0: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  Fcntl[0]);.    }
33d0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
33e0: 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  r++;.    pParse-
33f0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f  >rc = rc;.    go
3400: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
3410: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
3420: 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74 68  the pragma in th
3430: 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a  e lookup table *
3440: 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70 72  /.  pPragma = pr
3450: 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74  agmaLocate(zLeft
3460: 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  );.  if( pPragma
3470: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  ==0 ) goto pragm
3480: 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  a_out;..  /* Mak
3490: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
34a0: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  ase schema is lo
34b0: 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61 67  aded if the prag
34c0: 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ma requires that
34d0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67   */.  if( (pPrag
34e0: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
34f0: 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d  ragFlg_NeedSchem
3500: 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  a)!=0 ){.    if(
3510: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
3520: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
3530: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
3540: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
3550: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
3560: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72 61  mn names for pra
3570: 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72 6e  gmas that return
3580: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66   results */.  if
3590: 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  ( (pPragma->mPra
35a0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35b0: 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20  oColumns)==0 .  
35c0: 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d   && ((pPragma->m
35d0: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
35e0: 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30  g_NoColumns1)==0
35f0: 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20   || zRight==0). 
3600: 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67 6d   ){.    setPragm
3610: 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d  aResultColumnNam
3620: 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a  es(v, pPragma);.
3630: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
3640: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
3650: 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65 72  e pragma handler
3660: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 50   */.  switch( pP
3670: 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 20  ragma->ePragTyp 
3680: 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ){.  .#if !defin
3690: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
36a0: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26 26  AGER_PRAGMAS) &&
36b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
36c0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
36d0: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
36e0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66  GMA [schema.]def
36f0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
3700: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
3710: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
3720: 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a  che_size=N.  **.
3730: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
3740: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
3750: 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65  current persiste
3760: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
3770: 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
3780: 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61  he size.  The va
3790: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
37a0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
37b0: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
37c0: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
37d0: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
37e0: 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74  form sets both t
37f0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
3800: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
3810: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65  value and the pe
3820: 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61  rsistent page ca
3830: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20  che size value. 
3840: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
3850: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3860: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72  .  **.  ** Older
3870: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
3880: 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74 68  ite would set th
3890: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
38a0: 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e  size to a.  ** n
38b0: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 74  egative number t
38c0: 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63 68  o indicate synch
38d0: 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65  ronous=OFF.  The
38e0: 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72 6f  se days, synchro
38f0: 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77  nous.  ** is alw
3900: 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c  ays on by defaul
3910: 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  t regardless of 
3920: 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65 20  the sign of the 
3930: 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20  default cache.  
3940: 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63 6f  ** size.  But co
3950: 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20 74  ntinue to take t
3960: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
3970: 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  e of the default
3980: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3990: 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20 63   of historical c
39a0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20  ompatibility..  
39b0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
39c0: 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  p_DEFAULT_CACHE_
39d0: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61 74  SIZE: {.    stat
39e0: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
39f0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
3a00: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
3a10: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
3a20: 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53 69  pList getCacheSi
3a30: 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
3a40: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
3a50: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3a60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2a            /* 0 *
3a80: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  /.      { OP_Rea
3a90: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20  dCookie,  0, 1, 
3aa0: 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45 46         BTREE_DEF
3ab0: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d  AULT_CACHE_SIZE}
3ac0: 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  ,  /* 1 */.     
3ad0: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
3ae0: 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20     1, 8,        
3af0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
3b00: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 32  nteger,     0, 2
3b10: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3b20: 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63 74     { OP_Subtract
3b30: 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20  ,    1, 2,      
3b40: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
3b50: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
3b60: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
3b70: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
3b80: 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  r,     0, 1,    
3b90: 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20      0},         
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
3bc0: 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
3bd0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
3be0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75  .      { OP_Resu
3bf0: 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20  ltRow,   1, 1,  
3c00: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
3c10: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  .    VdbeOp *aOp
3c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3c30: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
3c40: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  b);.    if( !zRi
3c50: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ght ){.      pPa
3c60: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
3c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c80: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
3c90: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
3ca0: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
3cb0: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
3cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3cd0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
3ce0: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
3cf0: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c 20  , getCacheSize, 
3d00: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  iLn);.      if( 
3d10: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
3d20: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
3d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f   break;.      aO
3d40: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
3d50: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d       aOp[1].p1 =
3d60: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
3d70: 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f 44  6].p1 = SQLITE_D
3d80: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
3d90: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
3da0: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 73      int size = s
3db0: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73  qlite3AbsInt32(s
3dc0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
3dd0: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
3de0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
3df0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3e00: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
3e10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3e20: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
3e30: 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41 55  iDb, BTREE_DEFAU
3e40: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 73  LT_CACHE_SIZE, s
3e50: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
3e60: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3e70: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3e80: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
3e90: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
3ea0: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
3eb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3ec0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
3ed0: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
3ee0: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
3ef0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
3f00: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
3f10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3f20: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 26  _PAGER_PRAGMAS &
3f30: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  & !SQLITE_OMIT_D
3f40: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69  EPRECATED */..#i
3f50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3f60: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
3f70: 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  GMAS).  /*.  ** 
3f80: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f90: 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  ]page_size.  ** 
3fa0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3fb0: 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  ]page_size=N.  *
3fc0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
3fd0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
3fe0: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
3ff0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64  g for the.  ** d
4000: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
4010: 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  e in bytes.  The
4020: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
4030: 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  s the.  ** datab
4040: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76 61  ase page size va
4050: 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  lue.  The value 
4060: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  can only be set 
4070: 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  if.  ** the data
4080: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65 74  base has not yet
4090: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a 20   been created.. 
40a0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
40b0: 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a  yp_PAGE_SIZE: {.
40c0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
40d0: 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61   pDb->pBt;.    a
40e0: 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b  ssert( pBt!=0 );
40f0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
4100: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69   ){.      int si
4110: 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74 29  ze = ALWAYS(pBt)
4120: 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   ? sqlite3BtreeG
4130: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 20  etPageSize(pBt) 
4140: 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  : 0;.      retur
4150: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69  nSingleInt(v, si
4160: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
4170: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20        /* Malloc 
4180: 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73 65  may fail when se
4190: 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d 73  tting the page-s
41a0: 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69 73  ize, as there is
41b0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20   an internal.   
41c0: 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68 61     ** buffer tha
41d0: 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64 75  t the pager modu
41e0: 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e 67  le resizes using
41f0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
4200: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
4210: 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73     db->nextPages
4220: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  ize = sqlite3Ato
4230: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
4240: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
4250: 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
4260: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
4270: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4280: 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  ,-1,0) ){.      
4290: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
42a0: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t(db);.      }. 
42b0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
42c0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
42d0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
42e0: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
42f0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4300: 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74  ma.]secure_delet
4310: 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20  e=ON/OFF/FAST.  
4320: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
4330: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
4340: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4350: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4360: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c  secure_delete fl
4370: 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ag.  The second 
4380: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
4390: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
43a0: 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67   ** flag setting
43b0: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65   and reports the
43c0: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f   new value..  */
43d0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
43e0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b  SECURE_DELETE: {
43f0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
4400: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
4410: 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20  int b = -1;.    
4420: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
4430: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
4440: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
4450: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 52  lite3_stricmp(zR
4460: 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d 30  ight, "fast")==0
4470: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   ){.        b = 
4480: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
4490: 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69          b = sqli
44a0: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
44b0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
44c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
44d0: 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e  pId2->n==0 && b>
44e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
44f0: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
4500: 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
4510: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
4520: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
4530: 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b  eDelete(db->aDb[
4540: 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20  ii].pBt, b);.   
4550: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
4560: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
4570: 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c  ecureDelete(pBt,
4580: 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53   b);.    returnS
4590: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a  ingleInt(v, b);.
45a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
45b0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
45c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
45d0: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  age_count.  **  
45e0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
45f0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
4600: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
4610: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
4620: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
4630: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
4640: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
4650: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4660: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
4670: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
4680: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
4690: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
46a0: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
46b0: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
46c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
46d0: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
46e0: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
46f0: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
4700: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
4710: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
4720: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
4730: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
4740: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
4750: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
4760: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
4770: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
4780: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
4790: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
47a0: 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a  .]page_count.  *
47b0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
47c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
47d0: 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
47e0: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
47f0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
4800: 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  _PAGE_COUNT: {. 
4810: 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20     int iReg;.   
4820: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
4830: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
4840: 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20   iDb);.    iReg 
4850: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4860: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4870: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
4880: 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  ])=='p' ){.     
4890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
48a0: 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75  p2(v, OP_Pagecou
48b0: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a  nt, iDb, iReg);.
48c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
48d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
48e0: 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e  p3(v, OP_MaxPgcn
48f0: 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20  t, iDb, iReg, . 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
4920: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
4930: 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20  oi(zRight)));.  
4940: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
4950: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4960: 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c  ResultRow, iReg,
4970: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
4980: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4990: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
49a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
49b0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
49c0: 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  a.]locking_mode 
49d0: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
49e0: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
49f0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
4a00: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
4a10: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
4a20: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
4a30: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
4a40: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
4a50: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
4a60: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
4a70: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4a80: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
4a90: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
4aa0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
4ab0: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
4ac0: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
4ad0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
4ae0: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
4af0: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4b00: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4b10: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4b20: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4b30: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4b40: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4b50: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4b60: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4b70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b80: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4b90: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
4ba0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
4bb0: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
4bc0: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
4bd0: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
4be0: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
4bf0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4c00: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4c10: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4c20: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4c30: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4c40: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4c50: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4c60: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4c70: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4c80: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4c90: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
4ca0: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
4cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
4cc0: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
4cd0: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
4ce0: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
4cf0: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4d00: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4d10: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4d20: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4d30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4d40: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4d50: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4d60: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4d70: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4d80: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4d90: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
4da0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
4db0: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
4dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4dd0: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
4de0: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
4df0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4e00: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4e10: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4e20: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4e30: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4e40: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4e50: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4e60: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4e70: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4e80: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4e90: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4ea0: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4eb0: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4ed0: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4ee0: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4ef0: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4f00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4f10: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4f20: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4f30: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4f40: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4f50: 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74  ngleText(v, zRet
4f60: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4f70: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f90: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20  urnal_mode.  ** 
4fa0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4fb0: 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a  ]journal_mode =.
4fc0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
4fd0: 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74            (delet
4fe0: 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72  e|persist|off|tr
4ff0: 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61  uncate|memory|wa
5000: 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61  l|off).  */.  ca
5010: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
5020: 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69  AL_MODE: {.    i
5030: 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt eMode;       
5040: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
5050: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
5060: 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  _XXX symbols */.
5070: 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
5080: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5090: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66  unter */..    if
50a0: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
50b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
50c0: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
50d0: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
50e0: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
50f0: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
5100: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
5110: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
5120: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
5130: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
5140: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5150: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
5160: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5170: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
5180: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
5190: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
51a0: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
51b0: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
51c0: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
51d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
51e0: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
51f0: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
5200: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5210: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
5220: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
5230: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
5240: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
5250: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
5260: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
5270: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
5280: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
5290: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
52a0: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
52b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
52c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
52d0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 26 20 28  NALMODE_OFF && (
52e0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
52f0: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 21 3d 30  TE_Defensive)!=0
5300: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
5310: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6a 6f 75 72  o not allow jour
5320: 6e 61 6c 2d 6d 6f 64 65 20 22 4f 46 46 22 20 69  nal-mode "OFF" i
5330: 6e 20 64 65 66 65 6e 73 69 76 65 20 73 69 6e 63  n defensive sinc
5340: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
5350: 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65         ** can be
5360: 63 6f 6d 65 20 63 6f 72 72 75 70 74 65 64 20 75  come corrupted u
5370: 73 69 6e 67 20 6f 72 64 69 6e 61 72 79 20 53 51  sing ordinary SQ
5380: 4c 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  L when the journ
5390: 61 6c 20 69 73 20 6f 66 66 20 2a 2f 0a 20 20 20  al is off */.   
53a0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
53b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
53c0: 55 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UERY;.      }.  
53d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64    }.    if( eMod
53e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
53f0: 4d 4f 44 45 5f 51 55 45 52 59 20 26 26 20 70 49  MODE_QUERY && pI
5400: 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  d2->n==0 ){.    
5410: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52    /* Convert "PR
5420: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5430: 65 22 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20  e" into "PRAGMA 
5440: 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  main.journal_mod
5450: 65 22 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20  e" */.      iDb 
5460: 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d  = 0;.      pId2-
5470: 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  >n = 1;.    }.  
5480: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
5490: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
54a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
54b0: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
54c0: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
54d0: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
54e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
54f0: 73 42 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20  sBtree(v, ii);. 
5500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5510: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
5520: 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20  ournalMode, ii, 
5530: 31 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  1, eMode);.     
5540: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5560: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5570: 31 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b  1, 1);.    break
5580: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
5590: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
55a0: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
55b0: 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d  imit.  **  PRAGM
55c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
55d0: 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a  al_size_limit=N.
55e0: 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72    **.  ** Get or
55f0: 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69   set the size li
5600: 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  mit on rollback 
5610: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20  journal files.. 
5620: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
5630: 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  yp_JOURNAL_SIZE_
5640: 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67  LIMIT: {.    Pag
5650: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
5660: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
5670: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36  Db->pBt);.    i6
5680: 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20  4 iLimit = -2;. 
5690: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
56a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
56b0: 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
56c0: 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20  ht, &iLimit);.  
56d0: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d      if( iLimit<-
56e0: 31 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  1 ) iLimit = -1;
56f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69  .    }.    iLimi
5700: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
5710: 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
5720: 28 70 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29  (pPager, iLimit)
5730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
5740: 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29  leInt(v, iLimit)
5750: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
5760: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
5770: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5780: 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  AGMAS */..  /*. 
5790: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
57a0: 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ema.]auto_vacuum
57b0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
57c0: 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75  chema.]auto_vacu
57d0: 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47  um=N.  **.  ** G
57e0: 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 76 61  et or set the va
57f0: 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
5800: 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  ase 'auto-vacuum
5810: 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a  ' parameter..  *
5820: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f  * The value is o
5830: 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31  ne of:  0 NONE 1
5840: 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e   FULL 2 INCREMEN
5850: 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  TAL.  */.#ifndef
5860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5870: 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50  OVACUUM.  case P
5880: 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55  ragTyp_AUTO_VACU
5890: 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  UM: {.    Btree 
58a0: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
58b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
58c0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  !=0 );.    if( !
58d0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
58e0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
58f0: 76 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  v, sqlite3BtreeG
5900: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74  etAutoVacuum(pBt
5910: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
5920: 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d       int eAuto =
5930: 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a   getAutoVacuum(z
5940: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
5950: 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26  sert( eAuto>=0 &
5960: 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20  & eAuto<=2 );.  
5970: 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f      db->nextAuto
5980: 76 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b  vac = (u8)eAuto;
5990: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53  .      /* Call S
59a0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74  etAutoVacuum() t
59b0: 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65  o set initialize
59c0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75   the internal au
59d0: 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  to and.      ** 
59e0: 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67  incr-vacuum flag
59f0: 73 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  s. This is requi
5a00: 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
5a10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
5a20: 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65    ** creates the
5a30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
5a40: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
5a50: 74 68 61 74 20 69 74 20 69 73 20 63 72 65 61 74  that it is creat
5a60: 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61  ed.      ** as a
5a70: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  n auto-vacuum ca
5a80: 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20  pable db..      
5a90: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
5aa0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
5ab0: 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75  oVacuum(pBt, eAu
5ac0: 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  to);.      if( r
5ad0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5ae0: 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75  (eAuto==1 || eAu
5af0: 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20  to==2) ){.      
5b00: 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e    /* When settin
5b10: 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75  g the auto_vacuu
5b20: 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72  m mode to either
5b30: 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20   "full" or .    
5b40: 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e      ** "incremen
5b50: 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20  tal", write the 
5b60: 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d  value of meta[6]
5b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5b80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
5b90: 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
5ba0: 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65   to meta[6], che
5bb0: 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20  ck that meta[3] 
5bc0: 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20 20 20  indicates.      
5bd0: 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
5be0: 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f  eally is an auto
5bf0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
5c00: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
5c10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61    */.        sta
5c20: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
5c30: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
5c40: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20  LINENO(2);.     
5c50: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5c60: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65  VdbeOpList setMe
5c70: 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ta6[] = {.      
5c80: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
5c90: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20  tion,    0,     
5ca0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
5cb0: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
5cc0: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   0 */.          
5cd0: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
5ce0: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
5cf0: 31 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  1,         BTREE
5d00: 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41  _LARGEST_ROOT_PA
5d10: 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b  GE},.          {
5d20: 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20   OP_If,         
5d30: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 30      1,         0
5d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d50: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
5d60: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5d70: 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20  Halt,           
5d80: 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62  SQLITE_OK, OE_Ab
5d90: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d  ort,          0}
5da0: 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
5db0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
5dc0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
5dd0: 20 20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43         BTREE_INC
5de0: 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20  R_VACUUM, 0},   
5df0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20   /* 4 */.       
5e00: 20 7d 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65   };.        Vdbe
5e10: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20  Op *aOp;.       
5e20: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
5e30: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5e40: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
5e50: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
5e60: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
5e70: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  d(v, ArraySize(s
5e80: 65 74 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20  etMeta6));.     
5e90: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
5ea0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
5eb0: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65   ArraySize(setMe
5ec0: 74 61 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20  ta6), setMeta6, 
5ed0: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iLn);.        if
5ee0: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
5ef0: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
5f00: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5f10: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
5f20: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31  b;.        aOp[1
5f30: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
5f40: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20      aOp[2].p2 = 
5f50: 69 41 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20  iAddr+4;.       
5f60: 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62   aOp[4].p1 = iDb
5f70: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d  ;.        aOp[4]
5f80: 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b  .p3 = eAuto - 1;
5f90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5fa0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5fb0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
5fc0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
5fd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
5fe0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5ff0: 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74  chema.]increment
6000: 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a  al_vacuum(N).  *
6010: 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70  *.  ** Do N step
6020: 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s of incremental
6030: 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20   vacuuming on a 
6040: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
6050: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6060: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
6070: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43  case PragTyp_INC
6080: 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a  REMENTAL_VACUUM:
6090: 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69   {.    int iLimi
60a0: 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28  t, addr;.    if(
60b0: 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73   zRight==0 || !s
60c0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
60d0: 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20  Right, &iLimit) 
60e0: 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  || iLimit<=0 ){.
60f0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30        iLimit = 0
6100: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d  x7fffffff;.    }
6110: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
6120: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
6130: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
6140: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6150: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6160: 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29  eger, iLimit, 1)
6170: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
6180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6190: 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c  , OP_IncrVacuum,
61a0: 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72   iDb); VdbeCover
61b0: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
61c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
61d0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
61e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
61f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
6200: 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20  ddImm, 1, -1);. 
6210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6220: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
6230: 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65  , 1, addr); Vdbe
6240: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6250: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6260: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
6270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
6280: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
6290: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
62a0: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
62b0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
62c0: 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  a.]cache_size.  
62d0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
62e0: 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e  ma.]cache_size=N
62f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
6300: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
6310: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
6320: 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20  cal setting for 
6330: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
6340: 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65  che size. The se
6350: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
6360: 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61  he local.  ** pa
6370: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
6380: 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f  lue.  If N is po
6390: 73 69 74 69 76 65 20 74 68 65 6e 20 74 68 61 74  sitive then that
63a0: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d   is the.  ** num
63b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
63c0: 74 68 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e  the cache.  If N
63d0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
63e0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  en the.  ** numb
63f0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 61  er of pages is a
6400: 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61 74 20  djusted so that 
6410: 74 68 65 20 63 61 63 68 65 20 75 73 65 73 20 2d  the cache uses -
6420: 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a  N kibibytes.  **
6430: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f   of memory..  */
6440: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
6450: 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20  CACHE_SIZE: {.  
6460: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6470: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
6480: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
6490: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
64a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
64b0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
64c0: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
64d0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  size);.    }else
64e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
64f0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
6500: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44  Right);.      pD
6510: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
6520: 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  e_size = size;. 
6530: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6540: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44  eSetCacheSize(pD
6550: 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63  b->pBt, pDb->pSc
6560: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
6570: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
6580: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6590: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
65a0: 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a  ma.]cache_spill.
65b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
65c0: 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e  he_spill=BOOLEAN
65d0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
65e0: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69  chema.]cache_spi
65f0: 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ll=N.  **.  ** T
6600: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
6610: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
6620: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
6630: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
6640: 65 20 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69  e cache spill si
6650: 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66  ze. The second f
6660: 6f 72 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20  orm turns cache 
6670: 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72  spill on.  ** or
6680: 20 6f 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e   off.  When turn
6690: 6e 69 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c  ning cache spill
66a0: 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73   on, the size is
66b0: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
66c0: 20 63 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73   current cache_s
66d0: 69 7a 65 2e 20 20 54 68 65 20 74 68 69 72 64 20  ize.  The third 
66e0: 66 6f 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c  form sets a spil
66f0: 6c 20 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a  l size that.  **
6700: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
6710: 74 20 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65  t form the cache
6720: 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e   size..  ** If N
6730: 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65   is positive the
6740: 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  n that is the.  
6750: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6760: 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
6770: 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69    If N is negati
6780: 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ve, then the.  *
6790: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
67a0: 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f  s is adjusted so
67b0: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
67c0: 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65  uses -N kibibyte
67d0: 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  s.  ** of memory
67e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
67f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  he number of cac
6800: 68 65 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69  he_spill pages i
6810: 73 20 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20  s less then the 
6820: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
6830: 61 63 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c  ache_size pages,
6840: 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63   no spilling occ
6850: 75 72 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61  urs until the pa
6860: 67 65 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73  ge count exceeds
6870: 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
6880: 20 6f 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70   of cache_size p
6890: 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ages..  **.  ** 
68a0: 54 68 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  The cache_spill=
68b0: 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20  BOOLEAN setting 
68c0: 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61  applies to all a
68d0: 74 74 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c  ttached schemas,
68e0: 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74  .  ** not just t
68f0: 68 65 20 73 63 68 65 6d 61 20 73 70 65 63 69 66  he schema specif
6900: 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ied..  */.  case
6910: 20 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53   PragTyp_CACHE_S
6920: 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65  PILL: {.    asse
6930: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6940: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6950: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6960: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
6970: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6980: 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28  nt(v,.         (
6990: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
69a0: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d  TE_CacheSpill)==
69b0: 30 20 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20  0 ? 0 : .       
69c0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
69d0: 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44  eSetSpillSize(pD
69e0: 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20  b->pBt,0));.    
69f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
6a00: 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20   size = 1;.     
6a10: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
6a20: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69  nt32(zRight, &si
6a30: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ze) ){.        s
6a40: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70  qlite3BtreeSetSp
6a50: 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74  illSize(pDb->pBt
6a60: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  , size);.      }
6a70: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6a80: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
6a90: 67 68 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b  ght, size!=0) ){
6aa0: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
6ab0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63  gs |= SQLITE_Cac
6ac0: 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d  heSpill;.      }
6ad0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
6ae0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34  ->flags &= ~(u64
6af0: 29 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69  )SQLITE_CacheSpi
6b00: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
6b10: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
6b20: 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  gs(db);.    }.  
6b30: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6b40: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
6b50: 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69  [schema.]mmap_si
6b60: 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ze(N).  **.  ** 
6b70: 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70  Used to set mapp
6b80: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20  ing size limit. 
6b90: 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  The mapping size
6ba0: 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75   limit is.  ** u
6bb0: 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  sed to limit the
6bc0: 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20   aggregate size 
6bd0: 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61  of all memory ma
6be0: 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20  pped regions of 
6bf0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
6c00: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20  e file. If this 
6c10: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
6c20: 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d   to zero, then m
6c30: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20  emory mapping.  
6c40: 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61  ** is not used a
6c50: 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20  t all.  If N is 
6c60: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
6c70: 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72  he default memor
6c80: 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74  y map.  ** limit
6c90: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73   determined by s
6ca0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
6cb0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
6cc0: 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20  _SIZE) is set.. 
6cd0: 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65   ** The paramete
6ce0: 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20  r N is measured 
6cf0: 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20  in bytes..  **. 
6d00: 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69   ** This value i
6d10: 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65  s advisory.  The
6d20: 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20   underlying VFS 
6d30: 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72  is free to memor
6d40: 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69  y map.  ** as li
6d50: 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20  ttle or as much 
6d60: 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78  as it wants.  Ex
6d70: 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65  cept, if N is se
6d80: 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a  t to 0 then the.
6d90: 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72    ** upper layer
6da0: 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76  s will never inv
6db0: 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69  oke the xFetch i
6dc0: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65  nterfaces to the
6dd0: 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   VFS..  */.  cas
6de0: 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53  e PragTyp_MMAP_S
6df0: 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  IZE: {.    sqlit
6e00: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66  e3_int64 sz;.#if
6e10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6e20: 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65  _SIZE>0.    asse
6e30: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6e40: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6e50: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6e60: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
6e70: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
6e80: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
6e90: 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a  oI64(zRight, &sz
6ea0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c  );.      if( sz<
6eb0: 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33  0 ) sz = sqlite3
6ec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
6ed0: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  map;.      if( p
6ee0: 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e  Id2->n==0 ) db->
6ef0: 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20  szMmap = sz;.   
6f00: 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44     for(ii=db->nD
6f10: 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d  b-1; ii>=0; ii--
6f20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  ){.        if( d
6f30: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26  b->aDb[ii].pBt &
6f40: 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49  & (ii==iDb || pI
6f50: 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  d2->n==0) ){.   
6f60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6f70: 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
6f80: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
6f90: 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz);.        }.
6fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6fb0: 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72    sz = -1;.    r
6fc0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
6fd0: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
6fe0: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
6ff0: 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
7000: 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30  #else.    sz = 0
7010: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
7020: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E_OK;.#endif.   
7030: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7040: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
7050: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
7060: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  z);.    }else if
7070: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc!=SQLITE_NOT
7080: 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70  FOUND ){.      p
7090: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
70a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
70b0: 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = rc;.    }.    
70c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
70d0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
70e0: 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20  emp_store.  **  
70f0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
7100: 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22  re = "default"|"
7110: 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20  memory"|"file". 
7120: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
7130: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
7140: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
7150: 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20  mp_store flag.  
7160: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7170: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
7180: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
7190: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
71a0: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66  file and the def
71b0: 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20  ault.  ** value 
71c0: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
71d0: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
71e0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
71f0: 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pened..  **.  **
7200: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
7210: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
7220: 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c  e library compil
7230: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74  e-time options t
7240: 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20  o.  ** override 
7250: 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a  this setting.  *
7260: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7270: 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20  _TEMP_STORE: {. 
7280: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7290: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
72a0: 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74  ngleInt(v, db->t
72b0: 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20  emp_store);.    
72c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
72d0: 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ngeTempStorage(p
72e0: 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a  Parse, zRight);.
72f0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7300: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7310: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
7320: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20  ore_directory.  
7330: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
7340: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7350: 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79   = ""|"directory
7360: 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _name".  **.  **
7370: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7380: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7390: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
73a0: 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e  _directory flag.
73b0: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
73c0: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
73d0: 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74   specific direct
73e0: 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66  ory to be used f
73f0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
7400: 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67  es..  ** Setting
7410: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
7420: 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65  g reverts to the
7430: 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61   default tempora
7440: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61  ry directory sea
7450: 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d  rch..  ** If tem
7460: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
7470: 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
7480: 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70  n invalidateTemp
7490: 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  Storage..  **.  
74a0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
74b0: 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52  p_TEMP_STORE_DIR
74c0: 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66  ECTORY: {.    if
74d0: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
74e0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
74f0: 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74  ext(v, sqlite3_t
7500: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
7510: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
7520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
7530: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
7540: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7550: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7560: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7570: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
7580: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
7590: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
75a0: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
75b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
75c0: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
75d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
75e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
75f0: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
7600: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
7610: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
7620: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
7630: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7640: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45     if( SQLITE_TE
7650: 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20  MP_STORE==0.    
7660: 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45     || (SQLITE_TE
7670: 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64  MP_STORE==1 && d
7680: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31  b->temp_store<=1
7690: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c  ).       || (SQL
76a0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
76b0: 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74  2 && db->temp_st
76c0: 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b  ore==1).      ){
76d0: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
76e0: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ateTempStorage(p
76f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
7700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7710: 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ee(sqlite3_temp_
7720: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7730: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7740: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7750: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7760: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7770: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7780: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7790: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
77a0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
77b0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
77c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
77d0: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
77e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
77f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7800: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
7810: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
7820: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20  irectory.  **   
7830: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
7840: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22  e_directory = ""
7850: 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65  |"directory_name
7860: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
7870: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
7880: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
7890: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
78a0: 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61  ctory flag.  Cha
78b0: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
78c0: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
78d0: 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74  ific directory t
78e0: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
78f0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61  tabase files tha
7900: 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63  t.  ** were spec
7910: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
7920: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
7930: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
7940: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
7950: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65  s.  ** to the de
7960: 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64  fault database d
7970: 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20  irectory, which 
7980: 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
7990: 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  es specified wit
79a0: 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76  h.  ** a relativ
79b0: 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62  e path will prob
79c0: 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e  ably be based on
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72   the current dir
79e0: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20  ectory for the. 
79f0: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61   ** process.  Da
7a00: 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63  tabase file spec
7a10: 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62  ified with an ab
7a20: 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20  solute path are 
7a30: 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a  not impacted.  *
7a40: 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e  * by this settin
7a50: 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  g, regardless of
7a60: 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a   its value..  **
7a70: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7a80: 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f  gTyp_DATA_STORE_
7a90: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7aa0: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7ab0: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7ac0: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7ad0: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7ae0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7af0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7b00: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
7b10: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7b20: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
7b30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7b40: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
7b50: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
7b60: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7b70: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7b80: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7b90: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7bb0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7bc0: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7bd0: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7be0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7bf0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7c20: 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  ee(sqlite3_data_
7c30: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7c40: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7c50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7c60: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7c70: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7c80: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7c90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7ca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7cb0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
7cc0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7cd0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7ce0: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7cf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
7d00: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
7d10: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
7d20: 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  STYLE.  /*.  ** 
7d30: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7d40: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7d50: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
7d60: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72  [schema.]lock_pr
7d70: 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74  oxy_file = ":aut
7d80: 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70  o:"|"lock_file_p
7d90: 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ath".  **.  ** R
7da0: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7db0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
7dc0: 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c  ck_proxy_file fl
7dd0: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7de0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7df0: 73 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c  s a specific fil
7e00: 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  e to be used for
7e10: 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
7e20: 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a   locks..  **.  *
7e30: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7e40: 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45  _LOCK_PROXY_FILE
7e50: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
7e60: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ght ){.      Pag
7e70: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7e80: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7e90: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7ea0: 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65  char *proxy_file
7eb0: 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _path = NULL;.  
7ec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7ed0: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7ee0: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7ef0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7f00: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
7f10: 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
7f20: 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
7f30: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68  &proxy_file_path
7f60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
7f70: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f  ingleText(v, pro
7f80: 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20  xy_file_path);. 
7f90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7fa0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7fb0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7fc0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7fd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7fe0: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7ff0: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
8000: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
8010: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
8020: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
8030: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
8040: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
8050: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
8060: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
80a0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
80b0: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
80c0: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
80d0: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
80e0: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a   NULL);.      }.
8120: 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53        if( res!=S
8130: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8140: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8150: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69  Msg(pParse, "fai
8160: 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20  led to set lock 
8170: 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20  proxy file");.  
8180: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
8190: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  a_out;.      }. 
81a0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
81b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
81c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
81d0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20  ING_STYLE */    
81e0: 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    .    .  /*.  *
81f0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
8200: 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ma.]synchronous.
8210: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
8220: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
8230: 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c  us=OFF|ON|NORMAL
8240: 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a  |FULL|EXTRA.  **
8250: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
8260: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
8270: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68  lue of the synch
8280: 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68  ronous flag.  Ch
8290: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
82a0: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
82b0: 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
82c0: 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
82d0: 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  le and the.  ** 
82e0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
82f0: 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
8300: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
8310: 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a   database is.  *
8320: 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  * opened..  */. 
8330: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59   case PragTyp_SY
8340: 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20  NCHRONOUS: {.   
8350: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
8360: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
8370: 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61  leInt(v, pDb->sa
8380: 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20  fety_level-1);. 
8390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
83a0: 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
83b0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mit ){.        s
83c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
83d0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
83e0: 20 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65      "Safety leve
83f0: 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  l may not be cha
8400: 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72  nged inside a tr
8410: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
8420: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62     }else if( iDb
8430: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=1 ){.        i
8440: 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74  nt iLevel = (get
8450: 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67  SafetyLevel(zRig
8460: 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47  ht,0,1)+1) & PAG
8470: 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
8480: 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ASK;.        if(
8490: 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65   iLevel==0 ) iLe
84a0: 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  vel = 1;.       
84b0: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
84c0: 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20  el = iLevel;.   
84d0: 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53       pDb->bSyncS
84e0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
84f0: 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73  setAllPagerFlags
8500: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
8510: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8520: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8530: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
8540: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
8550: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8560: 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61  LAG_PRAGMAS.  ca
8570: 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a  se PragTyp_FLAG:
8580: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
8590: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65  t==0 ){.      se
85a0: 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c  tPragmaResultCol
85b0: 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61  umnNames(v, pPra
85c0: 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gma);.      retu
85d0: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28  rnSingleInt(v, (
85e0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61  db->flags & pPra
85f0: 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b  gma->iArg)!=0 );
8600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8610: 20 20 75 36 34 20 6d 61 73 6b 20 3d 20 70 50 72    u64 mask = pPr
8620: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f  agma->iArg;    /
8630: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
8640: 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20  o set or clear. 
8650: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  */.      if( db-
8660: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
8670: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
8680: 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74  eign key support
8690: 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62   may not be enab
86a0: 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20  led or disabled 
86b0: 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20  while not.      
86c0: 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d    ** in auto-com
86d0: 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  mit mode.  */.  
86e0: 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28        mask &= ~(
86f0: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
8700: 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ys);.      }.#if
8710: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
8720: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
8730: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
8740: 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f  uthLevel==UAUTH_
8750: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
8760: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
8770: 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20  non-admin users 
8780: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63  to modify the sc
8790: 68 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79  hema arbitrarily
87a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b   */.        mask
87b0: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69   &= ~(SQLITE_Wri
87c0: 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  teSchema);.     
87d0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
87e0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42   if( sqlite3GetB
87f0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
8800: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
8810: 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  >flags |= mask;.
8820: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8830: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
8840: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = ~mask;.       
8850: 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54   if( mask==SQLIT
8860: 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d  E_DeferFKs ) db-
8870: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8880: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  s = 0;.      }..
8890: 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66        /* Many of
88a0: 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61   the flag-pragma
88b0: 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64  s modify the cod
88c0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
88d0: 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a  he SQL .      **
88e0: 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63   compiler (eg. c
88f0: 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53  ount_changes). S
8900: 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  o add an opcode 
8910: 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20  to expire all.  
8920: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
8930: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
8940: 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  fter modifying a
8950: 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20   pragma value.. 
8960: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
8970: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8980: 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
8990: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
89a0: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
89b0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
89c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
89d0: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
89e0: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
89f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
8a00: 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  A_PRAGMAS.  /*. 
8a10: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62   **   PRAGMA tab
8a20: 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29  le_info(<table>)
8a30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
8a40: 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66  n a single row f
8a50: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
8a60: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
8a70: 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  e. The columns o
8a80: 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72  f.  ** the retur
8a90: 6e 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65  ned data set are
8aa0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a  :.  **.  ** cid:
8ab0: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69          Column i
8ac0: 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d  d (numbered from
8ad0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
8ae0: 73 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20  starting at 0). 
8af0: 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20   ** name:       
8b00: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a  Column name.  **
8b10: 20 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c   type:       Col
8b20: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  umn declaration 
8b30: 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75  type..  ** notnu
8b40: 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27  ll:    True if '
8b50: 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72  NOT NULL' is par
8b60: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  t of column decl
8b70: 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c  aration.  ** dfl
8b80: 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66  t_value: The def
8b90: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8ba0: 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e  he column, if an
8bb0: 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20 20 20  y..  ** pk:     
8bc0: 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66 6f 72      Non-zero for
8bd0: 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f   PK fields..  */
8be0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
8bf0: 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66 28 20  TABLE_INFO: if( 
8c00: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 54 61  zRight ){.    Ta
8c10: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
8c20: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
8c30: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
8c40: 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c 20 7a   LOCATE_NOERR, z
8c50: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
8c60: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
8c70: 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20     int iTabDb = 
8c80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
8c90: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
8ca0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69  Schema);.      i
8cb0: 6e 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69  nt i, k;.      i
8cc0: 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a  nt nHidden = 0;.
8cd0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
8ce0: 6f 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  ol;.      Index 
8cf0: 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
8d00: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
8d10: 61 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ab);.      pPars
8d20: 65 2d 3e 6e 4d 65 6d 20 3d 20 37 3b 0a 20 20 20  e->nMem = 7;.   
8d30: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
8d40: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
8d50: 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20  e, iTabDb);.    
8d60: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
8d70: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
8d80: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  se, pTab);.     
8d90: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
8da0: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
8db0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
8dc0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
8dd0: 6e 74 20 69 73 48 69 64 64 65 6e 20 3d 20 49 73  nt isHidden = Is
8de0: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8df0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
8e00: 69 73 48 69 64 64 65 6e 20 26 26 20 70 50 72 61  isHidden && pPra
8e10: 67 6d 61 2d 3e 69 41 72 67 3d 3d 30 20 29 7b 0a  gma->iArg==0 ){.
8e20: 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65            nHidde
8e30: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
8e40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8e50: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8e60: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
8e70: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
8e80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8e90: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
8ea0: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d   }else if( pPk==
8eb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b  0 ){.          k
8ec0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8ed0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
8ee0: 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d  or(k=1; k<=pTab-
8ef0: 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69  >nCol && pPk->ai
8f00: 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20  Column[k-1]!=i; 
8f10: 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d  k++){}.        }
8f20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8f30: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20   pCol->pDflt==0 
8f40: 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e  || pCol->pDflt->
8f50: 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20  op==TK_SPAN );. 
8f60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8f70: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
8f80: 2c 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20  , pPragma->iArg 
8f90: 3f 20 22 69 73 73 69 73 69 69 22 20 3a 20 22 69  ? "issisii" : "i
8fa0: 73 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20  ssisi",.        
8fb0: 20 20 20 20 20 20 20 69 2d 6e 48 69 64 64 65 6e         i-nHidden
8fc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8fd0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pCol->zName,.  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8ff0: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
9000: 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20 20 20 20  Col,""),.       
9010: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 6e 6f          pCol->no
9020: 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c 0a 20  tNull ? 1 : 0,. 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
9040: 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70 43 6f 6c  ol->pDflt ? pCol
9050: 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pDflt->u.zToke
9060: 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n : 0,.         
9070: 20 20 20 20 20 20 6b 2c 0a 20 20 20 20 20 20 20        k,.       
9080: 20 20 20 20 20 20 20 20 69 73 48 69 64 64 65 6e          isHidden
9090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
90a0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
90b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
90c0: 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  UG.  case PragTy
90d0: 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20 49  p_STATS: {.    I
90e0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
90f0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20  HashElem *i;.   
9100: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9110: 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  5;.    sqlite3Co
9120: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
9130: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
9140: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9150: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
9160: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
9170: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9180: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20 54  ext(i)){.      T
9190: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
91a0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
91b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
91c0: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
91d0: 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20 20 20   "ssiii",.      
91e0: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
91f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a  ,.           0,.
9200: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
9210: 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20 20  >szTabRow,.     
9220: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
9230: 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20 20 20  LogEst,.        
9240: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
9250: 73 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  s);.      for(pI
9260: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
9270: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9280: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
92a0: 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73 69  tiLoad(v, 2, "si
92b0: 69 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  iiX",.          
92c0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pIdx->zName,.  
92d0: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 73           pIdx->s
92e0: 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20 20  zIdxRow,.       
92f0: 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c      pIdx->aiRowL
9300: 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20  ogEst[0],.      
9310: 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53 74       pIdx->hasSt
9320: 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  at1);.        sq
9330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9340: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9350: 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 5);.      }.
9360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9370: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  k;.#endif..  cas
9380: 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f  e PragTyp_INDEX_
9390: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
93a0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
93b0: 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
93c0: 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d  pTab;.    pIdx =
93d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
93e0: 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  x(db, zRight, zD
93f0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  b);.    if( pIdx
9400: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49   ){.      int iI
9410: 64 78 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63  dxDb = sqlite3Sc
9420: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
9430: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pIdx->pSchema);.
9440: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9450: 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20     int mx;.     
9460: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
9470: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rg ){.        /*
9480: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69   PRAGMA index_xi
9490: 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69  nfo (newer versi
94a0: 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77  on with more row
94b0: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a  s and columns) *
94c0: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
94d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
94e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
94f0: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65  em = 6;.      }e
9500: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9510: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66  PRAGMA index_inf
9520: 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f  o (legacy versio
9530: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  n) */.        mx
9540: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
9550: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
9560: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
9570: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d    }.      pTab =
9580: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
9590: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
95a0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
95b0: 72 73 65 2c 20 69 49 64 78 44 62 29 3b 0a 20 20  rse, iIdxDb);.  
95c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
95d0: 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d  se->nMem<=pPragm
95e0: 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b  a->nPragCName );
95f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9600: 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<mx; i++){.    
9610: 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70      i16 cnum = p
9620: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
9630: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9640: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9650: 2c 20 31 2c 20 22 69 69 73 58 22 2c 20 69 2c 20  , 1, "iisX", i, 
9660: 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  cnum,.          
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20     cnum<0 ? 0 : 
9690: 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d  pTab->aCol[cnum]
96a0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
96b0: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
96c0: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
96d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
96e0: 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73 69 58  Load(v, 4, "isiX
96f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
9700: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
9710: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
9720: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c  pIdx->azColl[i],
9730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 70  .            i<p
9740: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
9750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9770: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9780: 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e  ow, 1, pParse->n
9790: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mem);.      }.  
97a0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
97b0: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
97c0: 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28  _INDEX_LIST: if(
97d0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49   zRight ){.    I
97e0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
97f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
9800: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62   int i;.    pTab
9810: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
9820: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
9830: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
9840: 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab ){.      int 
9850: 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33  iTabDb = sqlite3
9860: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
9870: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
9880: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
9890: 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20  nMem = 5;.      
98a0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
98b0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
98c0: 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20 66  iTabDb);.      f
98d0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
98e0: 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b  ndex, i=0; pIdx;
98f0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9900: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, i++){.       
9910: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f   const char *azO
9920: 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c  rigin[] = { "c",
9930: 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20   "u", "pk" };.  
9940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9950: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9960: 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20   "isisi",.      
9970: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20       i,.        
9980: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
9990: 20 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69             IsUni
99a0: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a  queIndex(pIdx),.
99b0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69             azOri
99c0: 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70  gin[pIdx->idxTyp
99d0: 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e],.           p
99e0: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
99f0: 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  re!=0);.      }.
9a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9a10: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9a20: 79 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54  yp_DATABASE_LIST
9a30: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  : {.    int i;. 
9a40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9a50: 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 3;.    for(i=0
9a60: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9a70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ){.      if( db-
9a80: 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
9a90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9aa0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
9ab0: 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20  [i].zDbSName!=0 
9ac0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9ad0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9ae0: 20 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20   1, "iss",.     
9af0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9b00: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
9b10: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71  ame,.         sq
9b20: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
9b30: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d  ename(db->aDb[i]
9b40: 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  .pBt));.    }.  
9b50: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
9b60: 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41  se PragTyp_COLLA
9b70: 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  TION_LIST: {.   
9b80: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
9b90: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
9ba0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9bb0: 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  2;.    for(p=sql
9bc0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9bd0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20  ->aCollSeq); p; 
9be0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
9bf0: 28 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  (p)){.      Coll
9c00: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
9c10: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
9c20: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20  shData(p);.     
9c30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9c40: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22  iLoad(v, 1, "is"
9c50: 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  , i++, pColl->zN
9c60: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
9c70: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66    break;..#ifdef
9c80: 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
9c90: 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
9ca0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e  case PragTyp_FUN
9cb0: 43 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20  CTION_LIST: {.  
9cc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73    int i;.    Has
9cd0: 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75  hElem *j;.    Fu
9ce0: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50  ncDef *p;.    pP
9cf0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a  arse->nMem = 2;.
9d00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
9d10: 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f  QLITE_FUNC_HASH_
9d20: 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  SZ; i++){.      
9d30: 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69  for(p=sqlite3Bui
9d40: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b  ltinFunctions.a[
9d50: 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48  i]; p; p=p->u.pH
9d60: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ash ){.        i
9d70: 66 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  f( p->funcFlags 
9d80: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e  & SQLITE_FUNC_IN
9d90: 54 45 52 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  TERNAL ) continu
9da0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
9db0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9dc0: 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a  v, 1, "si", p->z
9dd0: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Name, 1);.      
9de0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
9df0: 6a 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  j=sqliteHashFirs
9e00: 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 6a  t(&db->aFunc); j
9e10: 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; j=sqliteHashNe
9e20: 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 70 20  xt(j)){.      p 
9e30: 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69  = (FuncDef*)sqli
9e40: 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b 0a 20  teHashData(j);. 
9e50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9e60: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9e70: 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  "si", p->zName, 
9e80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
9e90: 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20  break;..#ifndef 
9ea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9eb0: 55 41 4c 54 41 42 4c 45 0a 20 20 63 61 73 65 20  UALTABLE.  case 
9ec0: 50 72 61 67 54 79 70 5f 4d 4f 44 55 4c 45 5f 4c  PragTyp_MODULE_L
9ed0: 49 53 54 3a 20 7b 0a 20 20 20 20 48 61 73 68 45  IST: {.    HashE
9ee0: 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 70 50 61 72  lem *j;.    pPar
9ef0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20  se->nMem = 1;.  
9f00: 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61    for(j=sqliteHa
9f10: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
9f20: 64 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69  dule); j; j=sqli
9f30: 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a  teHashNext(j)){.
9f40: 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d        Module *pM
9f50: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71  od = (Module*)sq
9f60: 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b  liteHashData(j);
9f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9f80: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9f90: 2c 20 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a 4e 61  , "s", pMod->zNa
9fa0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
9fb0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
9fc0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
9fd0: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
9fe0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 52   case PragTyp_PR
9ff0: 41 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  AGMA_LIST: {.   
a000: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
a010: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
a020: 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 3b 20 69  (aPragmaName); i
a030: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
a040: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
a050: 76 2c 20 31 2c 20 22 73 22 2c 20 61 50 72 61 67  v, 1, "s", aPrag
a060: 6d 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d 65 29  maName[i].zName)
a070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
a080: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
a090: 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54  QLITE_INTROSPECT
a0a0: 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  ION_PRAGMAS */..
a0b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a0c0: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41  _OMIT_SCHEMA_PRA
a0d0: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
a0e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a0f0: 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20  EIGN_KEY.  case 
a100: 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f  PragTyp_FOREIGN_
a110: 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52  KEY_LIST: if( zR
a120: 69 67 68 74 20 29 7b 0a 20 20 20 20 46 4b 65 79  ight ){.    FKey
a130: 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65   *pFK;.    Table
a140: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62   *pTab;.    pTab
a150: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a160: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
a170: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
a180: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 46 4b 20  ab ){.      pFK 
a190: 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20  = pTab->pFKey;. 
a1a0: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a       if( pFK ){.
a1b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 61 62          int iTab
a1c0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
a1d0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
a1e0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
a1f0: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b        int i = 0;
a200: 20 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65   .        pParse
a210: 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20  ->nMem = 8;.    
a220: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
a230: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
a240: 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20  se, iTabDb);.   
a250: 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b 29 7b       while(pFK){
a260: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
a270: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
a280: 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c  j=0; j<pFK->nCol
a290: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a2a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a2b0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
a2c0: 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20 20 20  iissssss",.     
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c                i,
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2f0: 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20 20 20      j,.         
a300: 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a            pFK->z
a310: 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  To,.            
a320: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
a330: 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69  l[pFK->aCol[j].i
a340: 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20  From].zName,.   
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  pFK->aCol[j].zCo
a370: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
a380: 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65        actionName
a390: 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  (pFK->aAction[1]
a3a0: 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45  ),  /* ON UPDATE
a3b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a3c0: 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d         actionNam
a3d0: 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30  e(pFK->aAction[0
a3e0: 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54  ]),  /* ON DELET
a3f0: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  E */.           
a400: 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b          "NONE");
a410: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a420: 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20         ++i;.    
a430: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d        pFK = pFK-
a440: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
a450: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a460: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
a470: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
a480: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a490: 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
a4a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a4b0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
a4c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a4d0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63  OMIT_TRIGGER.  c
a4e0: 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45  ase PragTyp_FORE
a4f0: 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b  IGN_KEY_CHECK: {
a500: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20  .    FKey *pFK; 
a510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a520: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
a530: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54  straint */.    T
a540: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
a550: 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74        /* Child t
a560: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45  able contain "RE
a570: 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72  FERENCES" keywor
a580: 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  d */.    Table *
a590: 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
a5a0: 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  /* Parent table 
a5b0: 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  that child point
a5c0: 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65  s to */.    Inde
a5d0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
a5e0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74     /* Index in t
a5f0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
a600: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a620: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
a630: 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62  Foreign key numb
a640: 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  er for pTab */. 
a650: 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
a660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a670: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c  p counter:  Fiel
a680: 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e  d of the foreign
a690: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68   key */.    Hash
a6a0: 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
a6b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a6c0: 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20  er:  Next table 
a6d0: 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  in schema */.   
a6e0: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
a6f0: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c          /* resul
a700: 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  t variable */.  
a710: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
a720: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65           /* 3 re
a730: 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
a740: 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
a750: 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20      int regKey; 
a760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a770: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b  gister to hold k
a780: 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20  ey for checking 
a790: 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e  the FK */.    in
a7a0: 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20  t regRow;       
a7b0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
a7c0: 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20  s to hold a row 
a7d0: 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20  from pTab */.   
a7e0: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
a7f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
a800: 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e  f a loop checkin
a810: 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a  g foreign keys *
a820: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b  /.    int addrOk
a830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a840: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
a850: 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20   key is OK */.  
a860: 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20    int *aiCols;  
a870: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c           /* chil
a880: 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75  d to parent colu
a890: 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20  mn mapping */.. 
a8a0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70     regResult = p
a8b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
a8c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
a8d0: 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79  += 4;.    regKey
a8e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a8f0: 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  m;.    regRow = 
a900: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
a910: 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61      k = sqliteHa
a920: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
a930: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [iDb].pSchema->t
a940: 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69  blHash);.    whi
a950: 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69  le( k ){.      i
a960: 6e 74 20 69 54 61 62 44 62 3b 0a 20 20 20 20 20  nt iTabDb;.     
a970: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
a980: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71         pTab = sq
a990: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a9a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67  (pParse, 0, zRig
a9b0: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  ht, zDb);.      
a9c0: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    k = 0;.      }
a9d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
a9e0: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
a9f0: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
aa00: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
aa10: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20  teHashNext(k);. 
aa20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
aa30: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62   pTab==0 || pTab
aa40: 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e  ->pFKey==0 ) con
aa50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 54 61  tinue;.      iTa
aa60: 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  bDb = sqlite3Sch
aa70: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
aa80: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
aa90: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
aaa0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
aab0: 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20  rse, iTabDb);.  
aac0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
aad0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61  Lock(pParse, iTa
aae0: 62 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  bDb, pTab->tnum,
aaf0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
ab00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
ab10: 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50  ->nCol+regRow>pP
ab20: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
ab30: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62  rse->nMem = pTab
ab40: 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b  ->nCol + regRow;
ab50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
ab60: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
ab70: 30 2c 20 69 54 61 62 44 62 2c 20 70 54 61 62 2c  0, iTabDb, pTab,
ab80: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
ab90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aba0: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65  LoadString(v, re
abb0: 67 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a  gResult, pTab->z
abc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
abd0: 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e  (i=1, pFK=pTab->
abe0: 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c  pFKey; pFK; i++,
abf0: 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46   pFK=pFK->pNextF
ac00: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50  rom){.        pP
ac10: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  arent = sqlite3F
ac20: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b  indTable(db, pFK
ac30: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
ac40: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
ac50: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
ac60: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
ac70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ac80: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
ac90: 65 2c 20 69 54 61 62 44 62 2c 20 70 50 61 72 65  e, iTabDb, pPare
aca0: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
acb0: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
acc0: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
acd0: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
ace0: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
acf0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
ad00: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
ad10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
ad20: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
ad30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ad40: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
ad50: 2c 20 69 2c 20 69 54 61 62 44 62 2c 20 70 50 61  , i, iTabDb, pPa
ad60: 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  rent, OP_OpenRea
ad70: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  d);.          }e
ad80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ad90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ada0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
adb0: 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  d, i, pIdx->tnum
adc0: 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20  , iTabDb);.     
add0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ade0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
adf0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
ae00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae20: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20     k = 0;.      
ae30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ae40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
ae60: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b  e->nErr>0 || pFK
ae70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
ae80: 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20   pFK ) break;.  
ae90: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
aea0: 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d  nTab<i ) pParse-
aeb0: 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20  >nTab = i;.     
aec0: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
aed0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
aee0: 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56  OP_Rewind, 0); V
aef0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
af00: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70        for(i=1, p
af10: 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  FK=pTab->pFKey; 
af20: 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46  pFK; i++, pFK=pF
af30: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  K->pNextFrom){. 
af40: 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d         pParent =
af50: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
af60: 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20  e(db, pFK->zTo, 
af70: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49  zDb);.        pI
af80: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
af90: 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20  aiCols = 0;.    
afa0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
afb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d  ){.          x =
afc0: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
afd0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
afe0: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
aff0: 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20  x, &aiCols);.   
b000: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
b010: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ==0 );.        }
b020: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20  .        addrOk 
b030: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
b040: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
b050: 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
b060: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61  rate code to rea
b070: 64 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  d the child key 
b080: 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69  values into regi
b090: 73 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  sters.        **
b0a0: 20 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b   regRow..regRow+
b0b0: 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  n. If any of the
b0c0: 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65   child key value
b0d0: 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73  s are NULL, this
b0e0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77   .        ** row
b0f0: 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e   cannot cause an
b100: 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a   FK violation. J
b110: 75 6d 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ump directly to 
b120: 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20  addrOk in .     
b130: 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e     ** this case.
b140: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
b150: 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c  j=0; j<pFK->nCol
b160: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b170: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43    int iCol = aiC
b180: 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20  ols ? aiCols[j] 
b190: 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69  : pFK->aCol[j].i
b1a0: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  From;.          
b1b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
b1c0: 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
b1d0: 76 2c 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c  v, pTab, 0, iCol
b1e0: 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20  , regRow+j);.   
b1f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b200: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b210: 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c  sNull, regRow+j,
b220: 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f   addrOk); VdbeCo
b230: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b240: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
b250: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b260: 6f 20 71 75 65 72 79 20 74 68 65 20 70 61 72 65  o query the pare
b270: 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d  nt index for a m
b280: 61 74 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20  atching parent. 
b290: 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49         ** key. I
b2a0: 66 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  f a match is fou
b2b0: 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  nd, jump to addr
b2c0: 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  Ok. */.        i
b2d0: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
b2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2f0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b300: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b310: 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b   pFK->nCol, regK
b320: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
b330: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
b340: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64  finityStr(db,pId
b350: 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a  x), pFK->nCol);.
b360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b370: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
b380: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61  , OP_Found, i, a
b390: 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30  ddrOk, regKey, 0
b3a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
b3b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b3c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b3d0: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
b3e0: 20 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73       int jmp = s
b3f0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b400: 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20  tAddr(v)+2;.    
b410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b420: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
b430: 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c  ekRowid, i, jmp,
b440: 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f   regRow); VdbeCo
b450: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b470: 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b  Goto(v, addrOk);
b480: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
b490: 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20  t( pFK->nCol==1 
b4a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
b4b0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b4c0: 65 20 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74  e code to report
b4d0: 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e   an FK violation
b4e0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
b4f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  */.        if( H
b500: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
b510: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b520: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b530: 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  OP_Rowid, 0, reg
b540: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
b550: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b570: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
b580: 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31  , 0, regResult+1
b590: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5b0: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67  MultiLoad(v, reg
b5c0: 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c  Result+2, "siX",
b5d0: 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b   pFK->zTo, i-1);
b5e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b5f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b600: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
b610: 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20  esult, 4);.     
b620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
b630: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
b640: 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  drOk);.        s
b650: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b660: 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20   aiCols);.      
b670: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b680: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b690: 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70  Next, 0, addrTop
b6a0: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
b6b0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
b6c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b6d0: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  v, addrTop);.   
b6e0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b6f0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b700: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
b710: 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69  RIGGER) */.#endi
b720: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b730: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
b740: 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64  N_KEY) */..#ifnd
b750: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b760: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
b770: 4b 45 5f 50 52 41 47 4d 41 0a 20 20 2f 2a 20 52  KE_PRAGMA.  /* R
b780: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b790: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b7a0: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b7b0: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b7c0: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b7d0: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b7e0: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b7f0: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b800: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53  case PragTyp_CAS
b810: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b820: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b830: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b840: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
b850: 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c  unctions(db, sql
b860: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b870: 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20  Right, 0));.    
b880: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
b890: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b8a0: 4f 4d 49 54 5f 43 41 53 45 5f 53 45 4e 53 49 54  OMIT_CASE_SENSIT
b8b0: 49 56 45 5f 4c 49 4b 45 5f 50 52 41 47 4d 41 20  IVE_LIKE_PRAGMA 
b8c0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b8d0: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
b8e0: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64  CK_ERROR_MAX.# d
b8f0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54  efine SQLITE_INT
b900: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
b910: 4f 52 5f 4d 41 58 20 31 30 30 0a 23 65 6e 64 69  OR_MAX 100.#endi
b920: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
b930: 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
b940: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 20 20 20 50  _CHECK.  /*    P
b950: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
b960: 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52  check.  **    PR
b970: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
b980: 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 20 20 20 20  heck(N).  **    
b990: 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65  PRAGMA quick_che
b9a0: 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  ck.  **    PRAGM
b9b0: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 28 4e 29  A quick_check(N)
b9c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 65 72 69 66  .  **.  ** Verif
b9d0: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  y the integrity 
b9e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
b9f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
ba00: 71 75 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20  quick_check" is 
ba10: 72 65 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20  reduced version 
ba20: 6f 66 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69  of .  ** integri
ba30: 74 79 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65  ty_check designe
ba40: 64 20 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74  d to detect most
ba50: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
ba60: 74 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75  tion.  ** withou
ba70: 74 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  t the overhead o
ba80: 66 20 63 72 6f 73 73 2d 63 68 65 63 6b 69 6e 67  f cross-checking
ba90: 20 69 6e 64 65 78 65 73 2e 20 20 51 75 69 63 6b   indexes.  Quick
baa0: 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 69 73 20 6c  _check.  ** is l
bab0: 69 6e 65 61 72 20 74 69 6d 65 20 77 68 65 72 65  inear time where
bac0: 61 73 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  ase integrity_ch
bad0: 65 63 6b 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e  eck is O(NlogN).
bae0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
baf0: 67 54 79 70 5f 49 4e 54 45 47 52 49 54 59 5f 43  gTyp_INTEGRITY_C
bb00: 48 45 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20  HECK: {.    int 
bb10: 69 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72  i, j, addr, mxEr
bb20: 72 3b 0a 0a 20 20 20 20 69 6e 74 20 69 73 51 75  r;..    int isQu
bb30: 69 63 6b 20 3d 20 28 73 71 6c 69 74 65 33 54 6f  ick = (sqlite3To
bb40: 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d  lower(zLeft[0])=
bb50: 3d 27 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ='q');..    /* I
bb60: 66 20 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d  f the PRAGMA com
bb70: 6d 61 6e 64 20 77 61 73 20 6f 66 20 74 68 65 20  mand was of the 
bb80: 66 6f 72 6d 20 22 50 52 41 47 4d 41 20 3c 64 62  form "PRAGMA <db
bb90: 3e 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  >.integrity_chec
bba0: 6b 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  k",.    ** then 
bbb0: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 74 68  iDb is set to th
bbc0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
bbd0: 61 74 61 62 61 73 65 20 69 64 65 6e 74 69 66 69  atabase identifi
bbe0: 65 64 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20  ed by <db>..    
bbf0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
bc00: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
bc10: 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 6f  f database iDb o
bc20: 6e 6c 79 20 69 73 20 76 65 72 69 66 69 65 64 20  nly is verified 
bc30: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 56 44  by.    ** the VD
bc40: 42 45 20 63 72 65 61 74 65 64 20 62 65 6c 6f 77  BE created below
bc50: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
bc60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
bc70: 65 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69  e command was si
bc80: 6d 70 6c 79 20 22 50 52 41 47 4d 41 20 69 6e 74  mply "PRAGMA int
bc90: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 20 28 6f  egrity_check" (o
bca0: 72 0a 20 20 20 20 2a 2a 20 22 50 52 41 47 4d 41  r.    ** "PRAGMA
bcb0: 20 71 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20   quick_check"), 
bcc0: 74 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20  then iDb is set 
bcd0: 74 6f 20 30 2e 20 49 6e 20 74 68 69 73 20 63 61  to 0. In this ca
bce0: 73 65 2c 20 73 65 74 20 69 44 62 0a 20 20 20 20  se, set iDb.    
bcf0: 2a 2a 20 74 6f 20 2d 31 20 68 65 72 65 2c 20 74  ** to -1 here, t
bd00: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
bd10: 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
bd20: 76 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67  verify the integ
bd30: 72 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61  rity.    ** of a
bd40: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
bd50: 62 61 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61  bases.  */.    a
bd60: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b  ssert( iDb>=0 );
bd70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
bd80: 3d 3d 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29  ==0 || pId2->z )
bd90: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e  ;.    if( pId2->
bda0: 7a 3d 3d 30 20 29 20 69 44 62 20 3d 20 2d 31 3b  z==0 ) iDb = -1;
bdb0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
bdc0: 69 7a 65 20 74 68 65 20 56 44 42 45 20 70 72 6f  ize the VDBE pro
bdd0: 67 72 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72  gram */.    pPar
bde0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20  se->nMem = 6;.. 
bdf0: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61     /* Set the ma
be00: 78 69 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e  ximum error coun
be10: 74 20 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d  t */.    mxErr =
be20: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
be30: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
be40: 58 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  X;.    if( zRigh
be50: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
be60: 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68  e3GetInt32(zRigh
be70: 74 2c 20 26 6d 78 45 72 72 29 3b 0a 20 20 20 20  t, &mxErr);.    
be80: 20 20 69 66 28 20 6d 78 45 72 72 3c 3d 30 20 29    if( mxErr<=0 )
be90: 7b 0a 20 20 20 20 20 20 20 20 6d 78 45 72 72 20  {.        mxErr 
bea0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  = SQLITE_INTEGRI
beb0: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
bec0: 41 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  AX;.      }.    
bed0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
bee0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
bef0: 74 65 67 65 72 2c 20 6d 78 45 72 72 2d 31 2c 20  teger, mxErr-1, 
bf00: 31 29 3b 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f  1); /* reg[1] ho
bf10: 6c 64 73 20 65 72 72 6f 72 73 20 6c 65 66 74 20  lds errors left 
bf20: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e  */..    /* Do an
bf30: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
bf40: 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
bf50: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f  e file */.    fo
bf60: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
bf70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61  ; i++){.      Ha
bf80: 73 68 45 6c 65 6d 20 2a 78 3b 20 20 20 20 20 2f  shElem *x;     /
bf90: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
bfa0: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  er tables in the
bfb0: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20   schema */.     
bfc0: 20 48 61 73 68 20 2a 70 54 62 6c 73 3b 20 20 20   Hash *pTbls;   
bfd0: 20 20 2f 2a 20 53 65 74 20 6f 66 20 61 6c 6c 20    /* Set of all 
bfe0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63  tables in the sc
bff0: 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e  hema */.      in
c000: 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20 20 20 2f  t *aRoot;      /
c010: 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f 74 20  * Array of root 
c020: 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20  page numbers of 
c030: 61 6c 6c 20 62 74 72 65 65 73 20 2a 2f 0a 20 20  all btrees */.  
c040: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
c050: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c060: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
c070: 6f 74 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ot[] */.      in
c080: 74 20 6d 78 49 64 78 20 3d 20 30 3b 20 20 20 2f  t mxIdx = 0;   /
c090: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
c0a0: 20 6f 66 20 69 6e 64 65 78 65 73 20 66 6f 72 20   of indexes for 
c0b0: 61 6e 79 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  any table */..  
c0c0: 20 20 20 20 69 66 28 20 4f 4d 49 54 5f 54 45 4d      if( OMIT_TEM
c0d0: 50 44 42 20 26 26 20 69 3d 3d 31 20 29 20 63 6f  PDB && i==1 ) co
c0e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
c0f0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 21 3d 69  ( iDb>=0 && i!=i
c100: 44 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  Db ) continue;..
c110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
c120: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
c130: 61 72 73 65 2c 20 69 29 3b 0a 0a 20 20 20 20 20  arse, i);..     
c140: 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72   /* Do an integr
c150: 69 74 79 20 63 68 65 63 6b 20 6f 66 20 74 68 65  ity check of the
c160: 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 2a 2a   B-Tree.      **
c170: 0a 20 20 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  .      ** Begin 
c180: 62 79 20 66 69 6e 64 69 6e 67 20 74 68 65 20 72  by finding the r
c190: 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72  oot pages number
c1a0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 61  s.      ** for a
c1b0: 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
c1c0: 64 69 63 65 73 20 69 6e 20 74 68 65 20 64 61 74  dices in the dat
c1d0: 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
c1e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
c1f0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
c200: 48 65 6c 64 28 64 62 2c 20 69 2c 20 30 29 20 29  Held(db, i, 0) )
c210: 3b 0a 20 20 20 20 20 20 70 54 62 6c 73 20 3d 20  ;.      pTbls = 
c220: 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68  &db->aDb[i].pSch
c230: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
c240: 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78      for(cnt=0, x
c250: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
c260: 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71  (pTbls); x; x=sq
c270: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29  liteHashNext(x))
c280: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
c290: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c2a0: 73 68 44 61 74 61 28 78 29 3b 20 20 2f 2a 20 43  shData(x);  /* C
c2b0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
c2c0: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c2d0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
c2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
c2f0: 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 20 2a 2f  index on pTab */
c300: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49 64  .        int nId
c310: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
c320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c330: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 20  mber of indexes 
c340: 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  on pTab */.     
c350: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
c360: 70 54 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  pTab) ) cnt++;. 
c370: 20 20 20 20 20 20 20 66 6f 72 28 6e 49 64 78 3d         for(nIdx=
c380: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c390: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c3a0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49  =pIdx->pNext, nI
c3b0: 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a  dx++){ cnt++; }.
c3c0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 64 78          if( nIdx
c3d0: 3e 6d 78 49 64 78 20 29 20 6d 78 49 64 78 20 3d  >mxIdx ) mxIdx =
c3e0: 20 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   nIdx;.      }. 
c3f0: 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c       aRoot = sql
c400: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c410: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
c420: 29 2a 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20  )*(cnt+1));.    
c430: 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29    if( aRoot==0 )
c440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
c450: 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74  r(cnt=0, x=sqlit
c460: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
c470: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
c480: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
c490: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c4a0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c4b0: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
c4c0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20  ex *pIdx;.      
c4d0: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
c4e0: 54 61 62 29 20 29 20 61 52 6f 6f 74 5b 2b 2b 63  Tab) ) aRoot[++c
c4f0: 6e 74 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  nt] = pTab->tnum
c500: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
c510: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c520: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c530: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
c540: 20 20 20 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d      aRoot[++cnt]
c550: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
c560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c570: 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 30 5d 20  .      aRoot[0] 
c580: 3d 20 63 6e 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  = cnt;..      /*
c590: 20 4d 61 6b 65 20 73 75 72 65 20 73 75 66 66 69   Make sure suffi
c5a0: 63 69 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  cient number of 
c5b0: 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62  registers have b
c5c0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
c5d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c5e0: 4d 65 6d 20 3d 20 4d 41 58 28 20 70 50 61 72 73  Mem = MAX( pPars
c5f0: 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78  e->nMem, 8+mxIdx
c600: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
c610: 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
c620: 68 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  he(pParse);..   
c630: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 62 2d 74     /* Do the b-t
c640: 72 65 65 20 69 6e 74 65 67 72 69 74 79 20 63 68  ree integrity ch
c650: 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  ecks */.      sq
c660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
c670: 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  v, OP_IntegrityC
c680: 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c 20 28 63  k, 2, cnt, 1, (c
c690: 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34 5f 49 4e  har*)aRoot,P4_IN
c6a0: 54 41 52 52 41 59 29 3b 0a 20 20 20 20 20 20 73  TARRAY);.      s
c6b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c6c0: 50 35 28 76 2c 20 28 75 38 29 69 29 3b 0a 20 20  P5(v, (u8)i);.  
c6d0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c6e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c6f0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 20 56  OP_IsNull, 2); V
c700: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c720: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
c730: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a  ring8, 0, 3, 0,.
c740: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c750: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a  MPrintf(db, "***
c760: 20 69 6e 20 64 61 74 61 62 61 73 65 20 25 73 20   in database %s 
c770: 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b  ***\n", db->aDb[
c780: 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c 0a 20 20  i].zDbSName),.  
c790: 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
c7a0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
c7b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c7c0: 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 33 2c 20  P_Concat, 2, 3, 
c7d0: 33 29 3b 0a 20 20 20 20 20 20 69 6e 74 65 67 72  3);.      integr
c7e0: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
c7f0: 77 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w(v);.      sqli
c800: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c810: 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20 20  v, addr);..     
c820: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
c830: 6c 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 72  l the indices ar
c840: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 63 6f  e constructed co
c850: 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
c860: 2f 0a 20 20 20 20 20 20 66 6f 72 28 78 3d 73 71  /.      for(x=sq
c870: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54  liteHashFirst(pT
c880: 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74  bls); x; x=sqlit
c890: 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20  eHashNext(x)){. 
c8a0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
c8b0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
c8c0: 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20  ata(x);.        
c8d0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 2a 70 50  Index *pIdx, *pP
c8e0: 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  k;.        Index
c8f0: 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20   *pPrior = 0;.  
c900: 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f        int loopTo
c910: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
c920: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
c930: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
c940: 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20   = -1;..        
c950: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3c 31  if( pTab->tnum<1
c960: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
c970: 20 53 6b 69 70 20 56 49 45 57 73 20 6f 72 20 56   Skip VIEWs or V
c980: 49 52 54 55 41 4c 20 54 41 42 4c 45 73 20 2a 2f  IRTUAL TABLEs */
c990: 0a 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 48  .        pPk = H
c9a0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20  asRowid(pTab) ? 
c9b0: 30 20 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61  0 : sqlite3Prima
c9c0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
c9d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c9e0: 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64  3OpenTableAndInd
c9f0: 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ices(pParse, pTa
ca00: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  b, OP_OpenRead, 
ca10: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61        1, 0, &iDa
ca40: 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29  taCur, &iIdxCur)
ca50: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 72 65 67  ;.        /* reg
ca60: 5b 37 5d 20 63 6f 75 6e 74 73 20 74 68 65 20 6e  [7] counts the n
ca70: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
ca80: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
ca90: 20 20 20 20 20 20 20 2a 2a 20 72 65 67 5b 38 2b         ** reg[8+
caa0: 69 5d 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75  i] counts the nu
cab0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
cac0: 69 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  in the i-th inde
cad0: 78 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x .        */.  
cae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
caf0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
cb00: 74 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20  teger, 0, 7);.  
cb10: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
cb20: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
cb30: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
cb40: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
cb50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cb60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cb70: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b  P_Integer, 0, 8+
cb80: 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74  j); /* index ent
cb90: 72 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ries counter */.
cba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cbb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
cbc0: 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20  ->nMem>=8+j );. 
cbd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
cbe0: 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
cbf0: 61 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37 2b  ange(pParse,1,7+
cc00: 6a 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  j) );.        sq
cc10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cc20: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44  v, OP_Rewind, iD
cc30: 61 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65  ataCur, 0); Vdbe
cc40: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
cc50: 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73       loopTop = s
cc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cc70: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37  (v, OP_AddImm, 7
cc80: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
cc90: 28 20 21 69 73 51 75 69 63 6b 20 29 7b 0a 20 20  ( !isQuick ){.  
cca0: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 6e 69 74          /* Sanit
ccb0: 79 20 63 68 65 63 6b 20 6f 6e 20 72 65 63 6f 72  y check on recor
ccc0: 64 20 68 65 61 64 65 72 20 64 65 63 6f 64 69 6e  d header decodin
ccd0: 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  g */.          s
cce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ccf0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
cd00: 44 61 74 61 43 75 72 2c 20 70 54 61 62 2d 3e 6e  DataCur, pTab->n
cd10: 43 6f 6c 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20  Col-1, 3);.     
cd20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd30: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
cd40: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
cd50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cd60: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
cd70: 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  all NOT NULL col
cd80: 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20  umns really are 
cd90: 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  NOT NULL */.    
cda0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
cdb0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
cdc0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
cdd0: 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20  *zErr;.         
cde0: 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20   int jmp2;.     
cdf0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
ce00: 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
ce10: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
ce20: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
ce30: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e  notNull==0 ) con
ce40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
ce50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ce60: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
ce70: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
ce80: 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20  ur, j, 3);.     
ce90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cea0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
ceb0: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
cec0: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
ced0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cee0: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
cef0: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
cf00: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
cf10: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  zErr = sqlite3MP
cf20: 72 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20  rintf(db, "NULL 
cf30: 76 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c  value in %s.%s",
cf40: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
cf70: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
cf80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cf90: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
cfa0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
cfb0: 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44  3, 0, zErr, P4_D
cfc0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
cfd0: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
cfe0: 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  kResultRow(v);. 
cff0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d000: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d010: 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  jmp2);.        }
d020: 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
d030: 66 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  fy CHECK constra
d040: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
d050: 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  if( pTab->pCheck
d060: 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
d070: 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68   SQLITE_IgnoreCh
d080: 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ecks)==0 ){.    
d090: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
d0a0: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
d0b0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
d0c0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29  pTab->pCheck, 0)
d0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d0e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d100: 20 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75     int addrCkFau
d110: 6c 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  lt = sqlite3Vdbe
d120: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
d130: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d140: 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20 73 71  nt addrCkOk = sq
d150: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d160: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
d170: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
d180: 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr;.            
d190: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
d1a0: 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
d1b0: 54 61 62 20 3d 20 69 44 61 74 61 43 75 72 20 2b  Tab = iDataCur +
d1c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
d1d0: 66 6f 72 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45  for(k=pCheck->nE
d1e0: 78 70 72 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29  xpr-1; k>0; k--)
d1f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d200: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
d210: 73 65 28 70 50 61 72 73 65 2c 20 70 43 68 65 63  se(pParse, pChec
d220: 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 61  k->a[k].pExpr, a
d230: 64 64 72 43 6b 46 61 75 6c 74 2c 20 30 29 3b 0a  ddrCkFault, 0);.
d240: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d250: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d260: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
d270: 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d  se, pCheck->a[0]
d280: 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b  .pExpr, addrCkOk
d290: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d2a0: 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
d2b0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
d2c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d2d0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
d2e0: 64 72 43 6b 46 61 75 6c 74 29 3b 0a 20 20 20 20  drCkFault);.    
d2f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
d300: 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
d310: 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d            zErr =
d320: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d330: 64 62 2c 20 22 43 48 45 43 4b 20 63 6f 6e 73 74  db, "CHECK const
d340: 72 61 69 6e 74 20 66 61 69 6c 65 64 20 69 6e 20  raint failed in 
d350: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
d360: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
d370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d390: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
d3a0: 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50  0, 3, 0, zErr, P
d3b0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
d3c0: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
d3d0: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
d3e0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d3f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d400: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d410: 6b 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  kOk);.          
d420: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
d430: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d440: 65 28 64 62 2c 20 70 43 68 65 63 6b 29 3b 0a 20  e(db, pCheck);. 
d450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d460: 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29 7b   if( !isQuick ){
d470: 20 2f 2a 20 4f 6d 69 74 20 74 68 65 20 72 65 6d   /* Omit the rem
d480: 61 69 6e 69 6e 67 20 74 65 73 74 73 20 66 6f 72  aining tests for
d490: 20 71 75 69 63 6b 5f 63 68 65 63 6b 20 2a 2f 0a   quick_check */.
d4a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
d4b0: 69 64 61 74 65 20 69 6e 64 65 78 20 65 6e 74 72  idate index entr
d4c0: 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  ies for the curr
d4d0: 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ent row */.     
d4e0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
d4f0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d500: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d510: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
d520: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
d530: 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c  mp2, jmp3, jmp4,
d540: 20 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20 20 20   jmp5;.         
d550: 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20     int ckUniq = 
d560: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d570: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
d580: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
d590: 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e  k==pIdx ) contin
d5a0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
d5b0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65  r1 = sqlite3Gene
d5c0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
d5d0: 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61 74 61  rse, pIdx, iData
d5e0: 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d 70 33  Cur, 0, 0, &jmp3
d5f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
d620: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  r, r1);.        
d630: 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64      pPrior = pId
d640: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  x;.            s
d650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d660: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38  (v, OP_AddImm, 8
d670: 2b 6a 2c 20 31 29 3b 2f 2a 20 69 6e 63 72 65 6d  +j, 1);/* increm
d680: 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20  ent entry count 
d690: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  */.            /
d6a0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6e  * Verify that an
d6b0: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 65 78 69   index entry exi
d6c0: 73 74 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  sts for the curr
d6d0: 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  ent table row */
d6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
d6f0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
d700: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
d710: 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ound, iIdxCur+j,
d720: 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20 20   ckUniq, r1,.   
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 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
d760: 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  mn); VdbeCoverag
d770: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d790: 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72  dString(v, 3, "r
d7a0: 6f 77 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ow ");.         
d7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d7c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
d7d0: 74 2c 20 37 2c 20 33 2c 20 33 29 3b 0a 20 20 20  t, 7, 3, 3);.   
d7e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d7f0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
d800: 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20 66  , 4, " missing f
d810: 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20 20  rom index ");.  
d820: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d830: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d840: 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20  P_Concat, 4, 3, 
d850: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
d860: 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp5 = sqlite3Vd
d870: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
d880: 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  4, pIdx->zName);
d890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d8a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d8b0: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20  , OP_Concat, 4, 
d8c0: 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 3);.         
d8d0: 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67 72     jmp4 = integr
d8e0: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
d8f0: 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w(v);.          
d900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d910: 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a  pHere(v, jmp2);.
d920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d930: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65  or UNIQUE indexe
d940: 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 6f  s, verify that o
d950: 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78  nly one entry ex
d960: 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20 20  ists with the.  
d970: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
d980: 72 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65  rent key.  The e
d990: 6e 74 72 79 20 69 73 20 75 6e 69 71 75 65 20 69  ntry is unique i
d9a0: 66 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e  f (1) any column
d9b0: 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20   is NULL.       
d9c0: 20 20 20 20 20 2a 2a 20 6f 72 20 28 32 29 20 74       ** or (2) t
d9d0: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 68 61  he next entry ha
d9e0: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 65  s a different ke
d9f0: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  y */.           
da00: 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
da10: 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20  ex(pIdx) ){.    
da20: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e            int un
da30: 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  iqOk = sqlite3Vd
da40: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
da50: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  se);.           
da60: 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20     int jmp6;.   
da70: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
da80: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
da90: 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49   for(kk=0; kk<pI
daa0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b  dx->nKeyCol; kk+
dab0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
dac0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
dad0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b  Idx->aiColumn[kk
dae0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
daf0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 21     assert( iCol!
db00: 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69 43 6f  =XN_ROWID && iCo
db10: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
db40: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
db50: 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e  notNull ) contin
db60: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
db70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
db90: 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f  ll, r1+kk, uniqO
dba0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
dbb0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
dbc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
dbd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
dbe0: 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65     jmp6 = sqlite
dbf0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc00: 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b  P_Next, iIdxCur+
dc10: 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  j); VdbeCoverage
dc20: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
dc30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
dc40: 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  to(v, uniqOk);. 
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dc60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dc70: 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20  (v, jmp6);.     
dc80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc90: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
dca0: 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64 78 43   OP_IdxGT, iIdxC
dcb0: 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72 31  ur+j, uniqOk, r1
dcc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43       pIdx->nKeyC
dcf0: 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
dd00: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
dd10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
dd20: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
dd30: 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72  "non-unique entr
dd40: 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  y in index ");. 
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dd60: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
dd70: 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp5);.         
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
dda0: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
ddb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ddc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ddd0: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b  mpHere(v, jmp4);
dde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ddf0: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
de00: 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
de10: 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp3);.         
de20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
de30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
de50: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f  t, iDataCur, loo
de60: 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72  pTop); VdbeCover
de70: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
de80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
de90: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31  ere(v, loopTop-1
dea0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
deb0: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
dec0: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  T.        if( !i
ded0: 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20  sQuick ){.      
dee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
def0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20  oadString(v, 2, 
df00: 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72  "wrong # of entr
df10: 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b  ies in index ");
df20: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
df30: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
df40: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
df50: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
df60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
df70: 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29   if( pPk==pIdx )
df80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
df90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dfa0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
dfb0: 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ount, iIdxCur+j,
dfc0: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
dfd0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
dfe0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dff0: 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20  Eq, 8+j, 0, 3); 
e000: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
e020: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
e030: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55  (v, SQLITE_NOTNU
e040: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
e050: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
e060: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64  String(v, 4, pId
e070: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
e080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e090: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
e0a0: 6f 6e 63 61 74 2c 20 34 2c 20 32 2c 20 33 29 3b  oncat, 4, 2, 3);
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
e0c0: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
e0d0: 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20  tRow(v);.       
e0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e0f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
e110: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
e120: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
e130: 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
e140: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20     } .    }.    
e150: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
e160: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
e170: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
e180: 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74  O(2);.      stat
e190: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
e1a0: 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20  ist endCode[] = 
e1b0: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41  {.        { OP_A
e1c0: 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30  ddImm,      1, 0
e1d0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
e1e0: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
e1f0: 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  { OP_IfNotZero, 
e200: 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30    1, 4,        0
e210: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
e220: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
e230: 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20  g8,     0, 3,   
e240: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32       0},    /* 2
e250: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
e260: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c  _ResultRow,   3,
e270: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   1,        0},  
e280: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
e290: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
e2a0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
e2b0: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
e2c0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
e2d0: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
e2e0: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e2f0: 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   5 */.        { 
e300: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 20  OP_Goto,        
e310: 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
e320: 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20      /* 6 */.    
e330: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
e340: 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61  p *aOp;..      a
e350: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
e360: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e370: 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c  aySize(endCode),
e380: 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a   endCode, iLn);.
e390: 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b        if( aOp ){
e3a0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
e3b0: 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20  p2 = 1-mxErr;.  
e3c0: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74        aOp[2].p4t
e3d0: 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b  ype = P4_STATIC;
e3e0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
e3f0: 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20  p4.z = "ok";.   
e400: 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34 74 79       aOp[5].p4ty
e410: 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a  pe = P4_STATIC;.
e420: 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70          aOp[5].p
e430: 34 2e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  4.z = (char*)sql
e440: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
e450: 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20 20 20  E_CORRUPT);.    
e460: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e470: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
e480: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
e490: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
e4a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
e4b0: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
e4c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
e4d0: 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
e4e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e4f0: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20  IT_UTF16.  /*.  
e500: 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f  **   PRAGMA enco
e510: 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47  ding.  **   PRAG
e520: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75  MA encoding = "u
e530: 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22  tf-8"|"utf-16"|"
e540: 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31  utf-16le"|"utf-1
e550: 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  6be".  **.  ** I
e560: 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d  n its first form
e570: 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65  , this pragma re
e580: 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69  turns the encodi
e590: 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20  ng of the main. 
e5a0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66   ** database. If
e5b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e5c0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
e5d0: 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  , it is initiali
e5e0: 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20  zed now..  **.  
e5f0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
e600: 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d  rm of this pragm
e610: 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  a is a no-op if 
e620: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e630: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20  e file.  ** has 
e640: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
e650: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e   initialized. In
e660: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65   this case it se
e670: 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  ts the default. 
e680: 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61   ** encoding tha
e690: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
e6a0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
e6b0: 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e  base file if a n
e6c0: 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  ew file.  ** is 
e6d0: 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65  created. If an e
e6e0: 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74  xisting main dat
e6f0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
e700: 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  ened, then the. 
e710: 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74   ** default text
e720: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
e730: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
e740: 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  ase is used..  *
e750: 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63  * .  ** In all c
e760: 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73  ases new databas
e770: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
e780: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
e790: 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65  and are.  ** cre
e7a0: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
e7b0: 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78  same default tex
e7c0: 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68  t encoding as th
e7d0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
e7e0: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69   If.  ** the mai
e7f0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  n database has n
e800: 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ot been initiali
e810: 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74  zed and/or creat
e820: 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20  ed when ATTACH. 
e830: 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c   ** is executed,
e840: 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   this is done be
e850: 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20  fore the ATTACH 
e860: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  operation..  **.
e870: 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f    ** In the seco
e880: 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61  nd form this pra
e890: 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78  gma sets the tex
e8a0: 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65  t encoding to be
e8b0: 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65   used in.  ** ne
e8c0: 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  w database files
e8d0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
e8e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  his database han
e8f0: 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a  dle. It is only.
e900: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69    ** useful if i
e910: 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65  nvoked immediate
e920: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69  ly after the mai
e930: 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a  n database i.  *
e940: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
e950: 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20  _ENCODING: {.   
e960: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
e970: 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20  ruct EncName {. 
e980: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e990: 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a  ;.      u8 enc;.
e9a0: 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d      } encnames[]
e9b0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54   = {.      { "UT
e9c0: 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  F8",     SQLITE_
e9d0: 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20  UTF8        },. 
e9e0: 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20       { "UTF-8", 
e9f0: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20     SQLITE_UTF8  
ea00: 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73        },  /* Mus
ea10: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d  t be element [1]
ea20: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
ea30: 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16le", SQLITE_U
ea40: 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f  TF16LE     },  /
ea50: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
ea60: 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [2] */.      {
ea70: 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c   "UTF-16be", SQL
ea80: 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20  ITE_UTF16BE     
ea90: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
eaa0: 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20  lement [3] */.  
eab0: 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c      { "UTF16le",
eac0: 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45    SQLITE_UTF16LE
ead0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
eae0: 22 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49  "UTF16be",  SQLI
eaf0: 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d  TE_UTF16BE     }
eb00: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  ,.      { "UTF-1
eb10: 36 22 2c 20 20 20 30 20 20 20 20 20 20 20 20 20  6",   0         
eb20: 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53           }, /* S
eb30: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
eb40: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  E */.      { "UT
eb50: 46 31 36 22 2c 20 20 20 20 30 20 20 20 20 20 20  F16",    0      
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
eb70: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
eb80: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
eb90: 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20  0, 0 }.    };.  
eba0: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45    const struct E
ebb0: 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20  ncName *pEnc;.  
ebc0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
ebd0: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
ebe0: 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20  ncoding" */.    
ebf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
ec00: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
ec10: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
ec20: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
ec30: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
ec40: 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49  _UTF8].enc==SQLI
ec50: 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
ec60: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
ec70: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  s[SQLITE_UTF16LE
ec80: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
ec90: 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  F16LE );.      a
eca0: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
ecb0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e  SQLITE_UTF16BE].
ecc0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
ecd0: 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74  6BE );.      ret
ece0: 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c  urnSingleText(v,
ecf0: 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50   encnames[ENC(pP
ed00: 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65  arse->db)].zName
ed10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20  );.    }else{   
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed30: 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20       /* "PRAGMA 
ed40: 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20  encoding = XXX" 
ed50: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  */.      /* Only
ed60: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
ed70: 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20  e of sqlite.enc 
ed80: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
ed90: 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20  handle is not.  
eda0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
edb0: 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  ed. If the main 
edc0: 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2c  database exists,
edd0: 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e   the new sqlite.
ede0: 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20  enc value.      
edf0: 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  ** will be overw
ee00: 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20  ritten when the 
ee10: 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c  schema is next l
ee20: 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65  oaded. If it doe
ee30: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61  s not.      ** a
ee40: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 69  lready exists, i
ee50: 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  t will be create
ee60: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77  d to use the new
ee70: 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e   encoding value.
ee80: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ee90: 69 66 28 20 0a 20 20 20 20 20 20 20 20 21 28 44  if( .        !(D
eea0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
eeb0: 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
eec0: 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  ded)) || .      
eed0: 20 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28    DbHasProperty(
eee0: 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29  db, 0, DB_Empty)
eef0: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
ef00: 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63     for(pEnc=&enc
ef10: 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e  names[0]; pEnc->
ef20: 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a  zName; pEnc++){.
ef30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d            if( 0=
ef40: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
ef50: 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e  zRight, pEnc->zN
ef60: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
ef70: 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64      SCHEMA_ENC(d
ef80: 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20  b) = ENC(db) =. 
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
efa0: 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d  Enc->enc ? pEnc-
efb0: 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54  >enc : SQLITE_UT
efc0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20  F16NATIVE;.     
efd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
efe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eff0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f000: 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  !pEnc->zName ){.
f010: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f020: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f030: 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65  , "unsupported e
f040: 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52  ncoding: %s", zR
f050: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  ight);.        }
f060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f070: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
f080: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f090: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
f0a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f0b0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50  SCHEMA_VERSION_P
f0c0: 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a  RAGMAS.  /*.  **
f0d0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f0e0: 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  a.]schema_versio
f0f0: 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  n.  **   PRAGMA 
f100: 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f  [schema.]schema_
f110: 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67  version = <integ
f120: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er>.  **.  **   
f130: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f140: 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  user_version.  *
f150: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f160: 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e  ma.]user_version
f170: 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a   = <integer>.  *
f180: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f190: 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73  [schema.]freelis
f1a0: 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a  t_count.  **.  *
f1b0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f1c0: 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e  ma.]data_version
f1d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  **.  **   PRA
f1e0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70  GMA [schema.]app
f1f0: 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a  lication_id.  **
f200: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f210: 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69  a.]application_i
f220: 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  d = <integer>.  
f230: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67  **.  ** The prag
f240: 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73  ma's schema_vers
f250: 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72  ion and user_ver
f260: 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  sion are used to
f270: 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a   set or get.  **
f280: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f290: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
f2a0: 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f   and user-versio
f2b0: 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  n, respectively.
f2c0: 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73   Both.  ** the s
f2d0: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e  chema-version an
f2e0: 64 20 74 68 65 20 75 73 65 72 2d 76 65 72 73 69  d the user-versi
f2f0: 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73 69  on are 32-bit si
f300: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20  gned integers.  
f310: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
f320: 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
f330: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
f340: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73  schema-cookie is
f350: 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61   usually only ma
f360: 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e  nipulated intern
f370: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f380: 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65  It.  ** is incre
f390: 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65  mented by SQLite
f3a0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
f3b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
f3c0: 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20   modified (by.  
f3d0: 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  ** creating or d
f3e0: 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20  ropping a table 
f3f0: 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73  or index). The s
f400: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73  chema version is
f410: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51   used by.  ** SQ
f420: 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61  Lite each time a
f430: 20 71 75 65 72 79 20 69 73 20 65 78 65 63 75 74   query is execut
f440: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
f450: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  t the internal c
f460: 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ache.  ** of the
f470: 20 73 63 68 65 6d 61 20 75 73 65 64 20 77 68 65   schema used whe
f480: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  n compiling the 
f490: 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65  SQL query matche
f4a0: 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a  s the schema of.
f4b0: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
f4c0: 65 20 61 67 61 69 6e 73 74 20 77 68 69 63 68 20  e against which 
f4d0: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65  the compiled que
f4e0: 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65  ry is actually e
f4f0: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75  xecuted..  ** Su
f500: 62 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65  bverting this me
f510: 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67  chanism by using
f520: 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f   "PRAGMA schema_
f530: 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69  version" to modi
f540: 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
f550: 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f  ma-version is po
f560: 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72  tentially danger
f570: 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64  ous and may lead
f580: 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a   to program.  **
f590: 20 63 72 61 73 68 65 73 20 6f 72 20 64 61 74 61   crashes or data
f5a0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
f5b0: 20 55 73 65 20 77 69 74 68 20 63 61 75 74 69 6f   Use with cautio
f5c0: 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n!.  **.  ** The
f5d0: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73   user-version is
f5e0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
f5f0: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f600: 49 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 62  It may be used b
f610: 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69  y.  ** applicati
f620: 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70  ons for any purp
f630: 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ose..  */.  case
f640: 20 50 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f   PragTyp_HEADER_
f650: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74  VALUE: {.    int
f660: 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67   iCookie = pPrag
f670: 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68  ma->iArg;  /* Wh
f680: 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65  ich cookie to re
f690: 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20  ad or write */. 
f6a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
f6b0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
f6c0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
f6d0: 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  && (pPragma->mPr
f6e0: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
f6f0: 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a  ReadOnly)==0 ){.
f700: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
f710: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f  he specified coo
f720: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  kie value */.   
f730: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f740: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f  VdbeOpList setCo
f750: 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  okie[] = {.     
f760: 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74     { OP_Transact
f770: 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20  ion,    0,  1,  
f780: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
f790: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
f7a0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
f7b0: 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20  0,  0},    /* 1 
f7c0: 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
f7d0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
f7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f7f0: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
f800: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
f810: 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b  ize(setCookie));
f820: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
f830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
f840: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  t(v, ArraySize(s
f850: 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f  etCookie), setCo
f860: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  okie, 0);.      
f870: 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c  if( ONLY_IF_REAL
f880: 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d  LOC_STRESS(aOp==
f890: 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
f8a0: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
f8b0: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  b;.      aOp[1].
f8c0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
f8d0: 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f  aOp[1].p2 = iCoo
f8e0: 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  kie;.      aOp[1
f8f0: 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74  ].p3 = sqlite3At
f900: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
f910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
f920: 52 65 61 64 20 74 68 65 20 73 70 65 63 69 66 69  Read the specifi
f930: 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  ed cookie value 
f940: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
f950: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
f960: 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20   readCookie[] = 
f970: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54  {.        { OP_T
f980: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20  ransaction,     
f990: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  0,  0},    /
f9a0: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
f9b0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
f9c0: 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c       0,  1,  0},
f9d0: 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
f9e0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
f9f0: 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c  ow,       1,  1,
fa00: 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20    0}.      };.  
fa10: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
fa20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fa30: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
fa40: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
fa50: 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65  ySize(readCookie
fa60: 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  ));.      aOp = 
fa70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa80: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
fa90: 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65  e(readCookie),re
faa0: 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20  adCookie,0);.   
fab0: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
fac0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
fad0: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
fae0: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
faf0: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
fb00: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
fb10: 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69     aOp[1].p3 = i
fb20: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71  Cookie;.      sq
fb30: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
fb40: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
fb50: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
fb60: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
fb70: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52  CHEMA_VERSION_PR
fb80: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
fb90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
fba0: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
fbb0: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
fbc0: 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74  AGMA compile_opt
fbd0: 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ions.  **.  ** R
fbe0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20  eturn the names 
fbf0: 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74  of all compile-t
fc00: 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64  ime options used
fc10: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a   in this build,.
fc20: 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20    ** one option 
fc30: 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  per row..  */.  
fc40: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d  case PragTyp_COM
fc50: 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a  PILE_OPTIONS: {.
fc60: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
fc70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fc80: 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Opt;.    pParse-
fc90: 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77  >nMem = 1;.    w
fca0: 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71  hile( (zOpt = sq
fcb0: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
fcc0: 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30  ion_get(i++))!=0
fcd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fce0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
fcf0: 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20  v, 1, zOpt);.   
fd00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd10: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
fd20: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
fd30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
fd40: 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20  beReusable(v);. 
fd50: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
fd60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fd70: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
fd80: 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  DIAGS */..#ifnde
fd90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
fda0: 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  L.  /*.  **   PR
fdb0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61  AGMA [schema.]wa
fdc0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70  l_checkpoint = p
fdd0: 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74  assive|full|rest
fde0: 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a  art|truncate.  *
fdf0: 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  *.  ** Checkpoin
fe00: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  t the database..
fe10: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
fe20: 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49  Typ_WAL_CHECKPOI
fe30: 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42  NT: {.    int iB
fe40: 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62  t = (pId2->z?iDb
fe50: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  :SQLITE_MAX_ATTA
fe60: 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65  CHED);.    int e
fe70: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
fe80: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
fe90: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
fea0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
feb0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
fec0: 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20  ght, "full")==0 
fed0: 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
fee0: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
fef0: 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  OINT_FULL;.     
ff00: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
ff10: 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
ff20: 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20  , "restart")==0 
ff30: 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
ff40: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
ff50: 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20  OINT_RESTART;.  
ff60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
ff70: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
ff80: 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29  ght, "truncate")
ff90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
ffa0: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
ffb0: 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
ffc0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
ffd0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
ffe0: 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74  m = 3;.    sqlit
fff0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10000 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69  OP_Checkpoint, i
10010 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20  Bt, eMode, 1);. 
10020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10030 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
10040 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d  tRow, 1, 3);.  }
10050 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a  .  break;..  /*.
10060 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61    **   PRAGMA wa
10070 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
10080 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77  .  **   PRAGMA w
10090 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
100a0 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
100b0 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74 61  Configure a data
100c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
100d0 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
100e0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61   checkpoint a da
100f0 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65  tabase.  ** afte
10100 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e  r accumulating N
10110 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
10120 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72  og. Or query for
10130 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
10140 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20  ue.  ** of N..  
10150 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
10160 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  p_WAL_AUTOCHECKP
10170 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20  OINT: {.    if( 
10180 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
10190 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
101a0 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73  checkpoint(db, s
101b0 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
101c0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t));.    }.    r
101d0 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
101e0 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57  , .       db->xW
101f0 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69  alCallback==sqli
10200 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
10210 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  k ? .           
10220 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
10230 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a  T(db->pWalArg) :
10240 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   0);.  }.  break
10250 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  ;.#endif..  /*. 
10260 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69   **  PRAGMA shri
10270 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20  nk_memory.  **. 
10280 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
10290 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34  ON-OF: R-23445-4
102a0 36 31 30 39 20 54 68 69 73 20 70 72 61 67 6d 61  6109 This pragma
102b0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
102c0 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63  base.  ** connec
102d0 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74  tion on which it
102e0 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66   is invoked to f
102f0 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
10300 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a  emory as it.  **
10310 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67   can, by calling
10320 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
10330 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20  ase_memory()..  
10340 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
10350 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a  p_SHRINK_MEMORY:
10360 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64   {.    sqlite3_d
10370 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
10380 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (db);.    break;
10390 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
103a0 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a 65   PRAGMA optimize
103b0 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70  .  **  PRAGMA op
103c0 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
103d0 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  *  PRAGMA schema
103e0 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20  .optimize.  **  
103f0 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70  PRAGMA schema.op
10400 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20 2a  timize(MASK).  *
10410 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74 20 74  *.  ** Attempt t
10420 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 64  o optimize the d
10430 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20 73 63  atabase.  All sc
10440 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69 6d 69  hemas are optimi
10450 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  zed in the first
10460 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73 2c  .  ** two forms,
10470 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73 70   and only the sp
10480 65 63 69 66 69 65 64 20 73 63 68 65 6d 61 20 69  ecified schema i
10490 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74  s optimized in t
104a0 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a 20  he latter two.. 
104b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 74   **.  ** The det
104c0 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a 61  ails of optimiza
104d0 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
104e0 62 79 20 74 68 69 73 20 70 72 61 67 6d 61 20 61  by this pragma a
104f0 72 65 20 65 78 70 65 63 74 65 64 0a 20 20 2a 2a  re expected.  **
10500 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64 20 69   to change and i
10510 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69 6d 65  mprove over time
10520 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20  .  Applications 
10530 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70 61 74  should anticipat
10540 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73  e that.  ** this
10550 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70 65 72   pragma will per
10560 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69 7a  form new optimiz
10570 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75 72 65  ations in future
10580 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a 0a   releases..  **.
10590 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e 61    ** The optiona
105a0 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  l argument is a 
105b0 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
105c0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66  izations to perf
105d0 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
105e0 20 20 30 78 30 30 30 31 20 20 20 20 44 65 62 75    0x0001    Debu
105f0 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f 20  gging mode.  Do 
10600 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70 65 72  not actually per
10610 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69 7a  form any optimiz
10620 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20 20  ations.  **     
10630 20 20 20 20 20 20 20 20 20 62 75 74 20 69 6e 73           but ins
10640 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e 65 20  tead return one 
10650 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 6f 72  line of text for
10660 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61 74 69   each optimizati
10670 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  on.  **         
10680 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c 64 20       that would 
10690 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e 20  have been done. 
106a0 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   Off by default.
106b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
106c0 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e 41 4c  0002    Run ANAL
106d0 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20 74 68  YZE on tables th
106e0 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66 69 74  at might benefit
106f0 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74  .  On by default
10700 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ..  **          
10710 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20 66 6f      See below fo
10720 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
10730 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  ormation..  **. 
10740 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20 20 20   **    0x0004   
10750 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d   (Not yet implem
10760 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20 75 73  ented) Record us
10770 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72 6d 61  age and performa
10780 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  nce .  **       
10790 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
107a0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  on from the curr
107b0 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e 20 74  ent session in t
107c0 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  he.  **         
107d0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
107e0 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  le so that it wi
107f0 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  ll be available 
10800 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20 20  to "optimize".  
10810 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10820 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79 20 66  pragmas run by f
10830 75 74 75 72 65 20 64 61 74 61 62 61 73 65 20 63  uture database c
10840 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
10850 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 38 20  .  **    0x0008 
10860 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c     (Not yet impl
10870 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74 65 20  emented) Create 
10880 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d 69 67  indexes that mig
10890 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20 20 20  ht have.  **    
108a0 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20 68            been h
108b0 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65 6e 74  elpful to recent
108c0 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20 20   queries.  **.  
108d0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 4d  ** The default M
108e0 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77 61 79  ASK is and alway
108f0 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66 66 66  s shall be 0xfff
10900 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61 6e 73  e.  0xfffe means
10910 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20 2a   perform all.  *
10920 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * of the optimiz
10930 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61 62  ations listed ab
10940 6f 76 65 20 65 78 63 65 70 74 20 44 65 62 75 67  ove except Debug
10950 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e 67   Mode, including
10960 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d 69   new.  ** optimi
10970 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  zations that hav
10980 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  e not yet been i
10990 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65 77  nvented.  If new
109a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61   optimizations a
109b0 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64 64  re.  ** ever add
109c0 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
109d0 65 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  e off by default
109e0 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d 64  , those off-by-d
109f0 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70 74  efault .  ** opt
10a00 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20  imizations will 
10a10 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f 66  have bitmasks of
10a20 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72 67   0x10000 or larg
10a30 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 45  er..  **.  ** DE
10a40 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20 57  TERMINATION OF W
10a50 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c 59  HEN TO RUN ANALY
10a60 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  ZE.  **.  ** In 
10a70 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
10a80 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74 61  ementation, a ta
10a90 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64 20  ble is analyzed 
10aa0 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6f  if only if all o
10ab0 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  f.  ** the follo
10ac0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
10ad0 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41 53   **.  ** (1) MAS
10ae0 4b 20 62 69 74 20 30 78 30 32 20 69 73 20 73 65  K bit 0x02 is se
10af0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29  t..  **.  ** (2)
10b00 20 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   The query plann
10b10 65 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f 73  er used sqlite_s
10b20 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74 69  tat1-style stati
10b30 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f 72  stics for one or
10b40 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20 69  .  **     more i
10b50 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74 61  ndexes of the ta
10b60 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ble at some poin
10b70 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66  t during the lif
10b80 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20 20  etime of.  **   
10b90 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f    the current co
10ba0 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  nnection..  **. 
10bb0 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20 6d   ** (3) One or m
10bc0 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  ore indexes of t
10bd0 68 65 20 74 61 62 6c 65 20 61 72 65 20 63 75 72  he table are cur
10be0 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a 65  rently unanalyze
10bf0 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74 68  d OR.  **     th
10c00 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
10c10 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68 61   in the table ha
10c20 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 32  s increased by 2
10c30 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65 0a  5 times or more.
10c40 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20 74    **     since t
10c50 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e 41  he last time ANA
10c60 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20 20  LYZE was run..  
10c70 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65  **.  ** The rule
10c80 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c 65  s for when table
10c90 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20 61  s are analyzed a
10ca0 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61  re likely to cha
10cb0 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74 75  nge in.  ** futu
10cc0 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a  re releases..  *
10cd0 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
10ce0 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20 20  _OPTIMIZE: {.   
10cf0 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20 20   int iDbLast;   
10d00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10d10 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69 6e  termination poin
10d20 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  t for the schema
10d30 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
10d40 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
10d50 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
10d60 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65 20  r a table whose 
10d70 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63 6b  size needs check
10d80 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68 45  ing */.    HashE
10d90 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
10da0 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
10db0 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65 6d  ables of a schem
10dc0 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  a */.    Schema 
10dd0 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20  *pSchema;       
10de0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 73  /* The current s
10df0 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61 62  chema */.    Tab
10e00 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
10e10 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
10e20 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  n the schema */.
10e30 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
10e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
10e50 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
10e60 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  ble */.    LogEs
10e70 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20 20  t szThreshold;  
10e80 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73 68    /* Size thresh
10e90 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68 20  old above which 
10ea0 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e 65  reanalysis is ne
10eb0 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  edd */.    char 
10ec0 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20 20  *zSubSql;       
10ed0 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    /* SQL stateme
10ee0 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53 71  nt for the OP_Sq
10ef0 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f 0a  lExec opcode */.
10f00 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20      u32 opMask; 
10f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10f20 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  sk of operations
10f30 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 0a   to perform */..
10f40 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
10f50 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  {.      opMask =
10f60 20 28 75 33 32 29 73 71 6c 69 74 65 33 41 74 6f   (u32)sqlite3Ato
10f70 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
10f80 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20 30   if( (opMask & 0
10f90 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  x02)==0 ) break;
10fa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10fb0 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66 66    opMask = 0xfff
10fc0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61  e;.    }.    iTa
10fd0 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  bCur = pParse->n
10fe0 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69  Tab++;.    for(i
10ff0 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44 62  DbLast = zDb?iDb
11000 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3c  :db->nDb-1; iDb<
11010 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b 29  =iDbLast; iDb++)
11020 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  {.      if( iDb=
11030 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
11040 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
11050 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
11060 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
11070 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61   pSchema = db->a
11080 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
11090 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  .      for(k=sql
110a0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
110b0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
110c0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
110d0 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
110e0 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
110f0 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
11100 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  k);..        /* 
11110 49 66 20 74 61 62 6c 65 20 70 54 61 62 20 68 61  If table pTab ha
11120 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20  s not been used 
11130 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 77 6f  in a way that wo
11140 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  uld benefit from
11150 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 69  .        ** havi
11160 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61 74  ng analysis stat
11170 69 73 74 69 63 73 20 64 75 72 69 6e 67 20 74 68  istics during th
11180 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f  e current sessio
11190 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74 2e  n, then skip it.
111a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
111b0 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65 66   also has the ef
111c0 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e 67  fect of skipping
111d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
111e0 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20 20  and views */.   
111f0 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e       if( (pTab->
11200 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53 74  tabFlags & TF_St
11210 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63 6f  atsUsed)==0 ) co
11220 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20  ntinue;..       
11230 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69 66   /* Reanalyze if
11240 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 32 35   the table is 25
11250 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74 68   times larger th
11260 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61 6c  an the last anal
11270 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ysis */.        
11280 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70 54  szThreshold = pT
11290 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 2b  ab->nRowLogEst +
112a0 20 34 36 3b 20 61 73 73 65 72 74 28 20 73 71 6c   46; assert( sql
112b0 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d 3d  ite3LogEst(25)==
112c0 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  46 );.        fo
112d0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
112e0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
112f0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11300 20 20 20 20 20 20 20 20 69 66 28 20 21 70 49 64          if( !pId
11310 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a 20  x->hasStat1 ){. 
11320 20 20 20 20 20 20 20 20 20 20 20 73 7a 54 68 72             szThr
11330 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20 41  eshold = 0; /* A
11340 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69 66  lways analyze if
11350 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b 73   any index lacks
11360 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   statistics */. 
11370 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11380 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
113a0 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64 20  if( szThreshold 
113b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
113c0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
113d0 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69  arse, iTabCur, i
113e0 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
113f0 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20  nRead);.        
11400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11410 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61 6c  Op3(v, OP_IfSmal
11420 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a 20  ler, iTabCur, . 
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11450 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11460 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c 20  )+2+(opMask&1), 
11470 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20 20  szThreshold);.  
11480 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
11490 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
114a0 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62 53   }.        zSubS
114b0 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
114c0 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a 45  ntf(db, "ANALYZE
114d0 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c   \"%w\".\"%w\"",
114e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
11510 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  DbSName, pTab->z
11520 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
11530 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30 31  f( opMask & 0x01
11540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
11550 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
11560 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11570 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11580 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11590 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
115a0 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20  r1, 0, zSubSql, 
115b0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
115c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
115d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
115e0 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31 29  esultRow, r1, 1)
115f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11600 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11610 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11620 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20 30  OP_SqlExec, 0, 0
11630 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34  , 0, zSubSql, P4
11640 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
11650 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11660 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
11670 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45  beAddOp0(v, OP_E
11680 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65 61  xpire);.    brea
11690 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
116a0 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
116b0 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50  timeout.  **   P
116c0 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f  RAGMA busy_timeo
116d0 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  ut = N.  **.  **
116e0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75   Call sqlite3_bu
116f0 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e  sy_timeout(db, N
11700 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 63  ).  Return the c
11710 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20 76  urrent timeout v
11720 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  alue.  ** if one
11730 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f 20   is set.  If no 
11740 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72 20  busy handler or 
11750 61 20 64 69 66 66 65 72 65 6e 74 20 62 75 73 79  a different busy
11760 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74 0a   handler is set.
11770 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20 72    ** then 0 is r
11780 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69 6e  eturned.  Settin
11790 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65 6f  g the busy_timeo
117a0 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61 74  ut to 0 or negat
117b0 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65  ive.  ** disable
117c0 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20  s the timeout.. 
117d0 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72 61   */.  /*case Pra
117e0 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55  gTyp_BUSY_TIMEOU
117f0 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20  T*/ default: {. 
11800 20 20 20 61 73 73 65 72 74 28 20 70 50 72 61 67     assert( pPrag
11810 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50 72  ma->ePragTyp==Pr
11820 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f  agTyp_BUSY_TIMEO
11830 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  UT );.    if( zR
11840 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
11850 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
11860 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74  ut(db, sqlite3At
11870 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20  oi(zRight));.   
11880 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
11890 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75  gleInt(v, db->bu
118a0 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20  syTimeout);.    
118b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
118c0 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73  .  **   PRAGMA s
118d0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20  oft_heap_limit. 
118e0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66   **   PRAGMA sof
118f0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e  t_heap_limit = N
11900 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
11910 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
11920 32 36 33 34 33 2d 34 35 39 33 30 20 54 68 69 73  26343-45930 This
11930 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20   pragma invokes 
11940 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
11950 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11960 36 34 28 29 20 69 6e 74 65 72 66 61 63 65 20 77  64() interface w
11970 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
11980 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a   N, if N is.  **
11990 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69   specified and i
119a0 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  s a non-negative
119b0 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49   integer..  ** I
119c0 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
119d0 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36 33 20  : R-64451-07163 
119e0 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  The soft_heap_li
119f0 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61 79  mit pragma alway
11a00 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  s.  ** returns t
11a10 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20  he same integer 
11a20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65  that would be re
11a30 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20  turned by the.  
11a40 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  ** sqlite3_soft_
11a50 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29  heap_limit64(-1)
11a60 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63   C-language func
11a70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
11a80 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f 48  e PragTyp_SOFT_H
11a90 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20  EAP_LIMIT: {.   
11aa0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e   sqlite3_int64 N
11ab0 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
11ac0 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
11ad0 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c  HexToI64(zRight,
11ae0 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   &N)==SQLITE_OK 
11af0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11b00 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11b10 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  64(N);.    }.   
11b20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
11b30 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  (v, sqlite3_soft
11b40 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31  _heap_limit64(-1
11b50 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
11b60 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11b70 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a 20  PRAGMA threads. 
11b80 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72   **   PRAGMA thr
11b90 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eads = N.  **.  
11ba0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
11bb0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
11bc0 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  of worker thread
11bd0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
11be0 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c  ew.  ** maximum,
11bf0 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
11c00 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75 65 73  less than reques
11c10 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
11c20 20 50 72 61 67 54 79 70 5f 54 48 52 45 41 44 53   PragTyp_THREADS
11c30 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
11c40 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28  int64 N;.    if(
11c50 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26 20   zRight.     && 
11c60 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
11c70 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29  oI64(zRight, &N)
11c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
11c90 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a   && N>=0.    ){.
11ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
11cb0 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c  mit(db, SQLITE_L
11cc0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
11cd0 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78 37  ADS, (int)(N&0x7
11ce0 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20 7d  fffffff));.    }
11cf0 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11d00 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  eInt(v, sqlite3_
11d10 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
11d20 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
11d30 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20  READS, -1));.   
11d40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66   break;.  }..#if
11d50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11d60 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
11d70 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
11d80 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20   /*.  ** Report 
11d90 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
11da0 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20 66  e of file logs f
11db0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  or all databases
11dc0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
11dd0 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53  gTyp_LOCK_STATUS
11de0 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
11df0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
11e00 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20   azLockName[] = 
11e10 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65  {.      "unlocke
11e20 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22 72  d", "shared", "r
11e30 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64 69  eserved", "pendi
11e40 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65 22  ng", "exclusive"
11e50 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
11e60 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
11e70 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72  Mem = 2;.    for
11e80 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
11e90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11ea0 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20 63  ee *pBt;.      c
11eb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74  onst char *zStat
11ec0 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  e = "unknown";. 
11ed0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
11ee0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
11ef0 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63  .zDbSName==0 ) c
11f00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
11f10 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11f20 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
11f30 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Bt==0 || sqlite3
11f40 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3d  BtreePager(pBt)=
11f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  =0 ){.        zS
11f60 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b  tate = "closed";
11f70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11f80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
11f90 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62  ntrol(db, i ? db
11fa0 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
11fb0 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20  e : 0, .        
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
11fe0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
11ff0 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45  ATE, &j)==SQLITE
12000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12010 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e  zState = azLockN
12020 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  ame[j];.      }.
12030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12040 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
12050 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69   "ss", db->aDb[i
12060 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61  ].zDbSName, zSta
12070 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  te);.    }.    b
12080 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
12090 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
120a0 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 50  HAS_CODEC.  /* P
120b0 72 61 67 6d 61 20 20 20 20 20 20 20 20 69 41 72  ragma        iAr
120c0 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  g.  ** ---------
120d0 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  -   ------.  ** 
120e0 20 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 30   key           0
120f0 0a 20 20 2a 2a 20 20 72 65 6b 65 79 20 20 20 20  .  **  rekey    
12100 20 20 20 20 20 31 0a 20 20 2a 2a 20 20 68 65 78       1.  **  hex
12110 6b 65 79 20 20 20 20 20 20 20 20 32 0a 20 20 2a  key        2.  *
12120 2a 20 20 68 65 78 72 65 6b 65 79 20 20 20 20 20  *  hexrekey     
12130 20 33 0a 20 20 2a 2a 20 20 74 65 78 74 6b 65 79   3.  **  textkey
12140 20 20 20 20 20 20 20 34 0a 20 20 2a 2a 20 20 74         4.  **  t
12150 65 78 74 72 65 6b 65 79 20 20 20 20 20 35 0a 20  extrekey     5. 
12160 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
12170 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66  yp_KEY: {.    if
12180 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
12190 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 5d 3b    char zBuf[40];
121a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
121b0 72 20 2a 7a 4b 65 79 20 3d 20 7a 52 69 67 68 74  r *zKey = zRight
121c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
121d0 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61       if( pPragma
121e0 2d 3e 69 41 72 67 3d 3d 32 20 7c 7c 20 70 50 72  ->iArg==2 || pPr
121f0 61 67 6d 61 2d 3e 69 41 72 67 3d 3d 33 20 29 7b  agma->iArg==3 ){
12200 0a 20 20 20 20 20 20 20 20 75 38 20 69 42 79 74  .        u8 iByt
12210 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e;.        int i
12220 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
12230 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
12240 7a 65 6f 66 28 7a 42 75 66 29 2a 32 20 26 26 20  zeof(zBuf)*2 && 
12250 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
12260 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29  zRight[i]); i++)
12270 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 79 74  {.          iByt
12280 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b  e = (iByte<<4) +
12290 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
122a0 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20  (zRight[i]);.   
122b0 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29         if( (i&1)
122c0 21 3d 30 20 29 20 7a 42 75 66 5b 69 2f 32 5d 20  !=0 ) zBuf[i/2] 
122d0 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 20  = iByte;.       
122e0 20 7d 0a 20 20 20 20 20 20 20 20 7a 4b 65 79 20   }.        zKey 
122f0 3d 20 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20  = zBuf;.        
12300 6e 20 3d 20 69 2f 32 3b 0a 20 20 20 20 20 20 7d  n = i/2;.      }
12310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 20  else{.        n 
12320 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3c  = pPragma->iArg<
12330 34 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65  4 ? sqlite3Strle
12340 6e 33 30 28 7a 52 69 67 68 74 29 20 3a 20 2d 31  n30(zRight) : -1
12350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12360 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69 41  if( (pPragma->iA
12370 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20 20  rg & 1)==0 ){.  
12380 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12390 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
123a0 62 2c 20 7a 4b 65 79 2c 20 6e 29 3b 0a 20 20 20  b, zKey, n);.   
123b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
123d0 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  ekey_v2(db, zDb,
123e0 20 7a 4b 65 79 2c 20 6e 29 3b 0a 20 20 20 20 20   zKey, n);.     
123f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
12400 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 21  =SQLITE_OK && n!
12410 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
12420 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
12430 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  ols(v, 1);.     
12440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
12450 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43  tColName(v, 0, C
12460 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 6f 6b  OLNAME_NAME, "ok
12470 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
12480 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12490 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 22  nSingleText(v, "
124a0 6f 6b 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ok");.      }.  
124b0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
124c0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
124d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
124e0 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
124f0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
12500 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50  _CEROD).  case P
12510 72 61 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f  ragTyp_ACTIVATE_
12520 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20  EXTENSIONS: if( 
12530 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66  zRight ){.#ifdef
12540 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
12550 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  C.    if( sqlite
12560 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74  3StrNICmp(zRight
12570 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20  , "see-", 4)==0 
12580 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12590 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a  _activate_see(&z
125a0 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d  Right[4]);.    }
125b0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
125c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52  QLITE_ENABLE_CER
125d0 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  OD.    if( sqlit
125e0 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68  e3StrNICmp(zRigh
125f0 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d  t, "cerod-", 6)=
12600 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
12610 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72  te3_activate_cer
12620 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a  od(&zRight[6]);.
12630 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
12640 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
12650 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
12660 74 68 65 20 50 52 41 47 4d 41 20 73 77 69 74 63  the PRAGMA switc
12670 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  h */..  /* The f
12680 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69  ollowing block i
12690 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
126a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
126b0 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e   defined. Its on
126c0 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20  ly.  ** purpose 
126d0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 61 73  is to execute as
126e0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
126f0 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
12700 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61   if the.  ** Pra
12710 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20  gFlg_NoColumns1 
12720 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
12730 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69  the caller speci
12740 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74  fied an argument
12750 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41  .  ** to the PRA
12760 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  GMA, the impleme
12770 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  ntation has not 
12780 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73  added any OP_Res
12790 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73  ultRow .  ** ins
127a0 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  tructions to the
127b0 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28   VM.  */.  if( (
127c0 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
127d0 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
127e0 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68  lumns1) && zRigh
127f0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
12800 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75  VdbeVerifyNoResu
12810 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70  ltRow(v);.  }..p
12820 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c  ragma_out:.  sql
12830 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12840 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
12850 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68  DbFree(db, zRigh
12860 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  t);.}.#ifndef SQ
12870 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12880 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  LTABLE./********
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128d0 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  *****.** Impleme
128e0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70  ntation of an ep
128f0 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
12900 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20  table that runs 
12910 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a  a pragma..**.*/.
12920 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
12930 72 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61  ragmaVtab Pragma
12940 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74  Vtab;.typedef st
12950 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43  ruct PragmaVtabC
12960 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62  ursor PragmaVtab
12970 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50  Cursor;.struct P
12980 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71  ragmaVtab {.  sq
12990 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b  lite3_vtab base;
129a0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
129b0 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
129c0 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
129d0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
129e0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
129f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12a00 74 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f  to which it belo
12a10 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50  ngs */.  const P
12a20 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65  ragmaName *pName
12a30 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
12a40 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38  e pragma */.  u8
12a50 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20   nHidden;       
12a60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12a70 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75  r of hidden colu
12a80 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64  mns */.  u8 iHid
12a90 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  den;            
12aa0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12ab0 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20  he first hidden 
12ac0 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72  column */.};.str
12ad0 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75  uct PragmaVtabCu
12ae0 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
12af0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
12b00 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73  e; /* Base class
12b10 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  .  Must be first
12b20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
12b30 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20  mt *pPragma;    
12b40 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73 74  /* The pragma st
12b50 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a  atement to run *
12b60 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
12b70 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a   iRowid;      /*
12b80 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
12b90 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  /.  char *azArg[
12ba0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2];           /*
12bb0 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72   Value of the ar
12bc0 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d  gument and schem
12bd0 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  a */.};../* .** 
12be0 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
12bf0 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e  able module xCon
12c00 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nect method..*/.
12c10 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
12c20 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20  aVtabConnect(.  
12c30 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
12c40 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
12c50 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
12c60 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
12c70 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
12c80 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
12c90 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73  *pzErr.){.  cons
12ca0 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50  t PragmaName *pP
12cb0 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50  ragma = (const P
12cc0 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b  ragmaName*)pAux;
12cd0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
12ce0 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Tab = 0;.  int r
12cf0 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  c;.  int i, j;. 
12d00 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27   char cSep = '('
12d10 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63  ;.  StrAccum acc
12d20 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  ;.  char zBuf[20
12d30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  0];..  UNUSED_PA
12d40 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
12d50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12d60 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74  R(argv);.  sqlit
12d70 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
12d80 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69  acc, 0, zBuf, si
12d90 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a  zeof(zBuf), 0);.
12da0 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
12db0 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22 43  pendall(&acc, "C
12dc0 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b  REATE TABLE x");
12dd0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50  .  for(i=0, j=pP
12de0 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d  ragma->iPragCNam
12df0 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50  e; i<pPragma->nP
12e00 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a  ragCName; i++, j
12e10 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
12e20 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
12e30 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63  c, "%c\"%s\"", c
12e40 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a  Sep, pragCName[j
12e50 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27  ]);.    cSep = '
12e60 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d  ,';.  }.  if( i=
12e70 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12e80 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61  3_str_appendf(&a
12e90 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70  cc, "(\"%s\"", p
12ea0 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a  Pragma->zName);.
12eb0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a      i++;.  }.  j
12ec0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61   = 0;.  if( pPra
12ed0 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
12ee0 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20  PragFlg_Result1 
12ef0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
12f00 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
12f10 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22  c, ",arg HIDDEN"
12f20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
12f30 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d    if( pPragma->m
12f40 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46  PragFlg & (PragF
12f50 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61  lg_SchemaOpt|Pra
12f60 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20  gFlg_SchemaReq) 
12f70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
12f80 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
12f90 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44  c, ",schema HIDD
12fa0 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  EN");.    j++;. 
12fb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72   }.  sqlite3_str
12fc0 5f 61 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29  _append(&acc, ")
12fd0 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 1);.  sqlite3
12fe0 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
12ff0 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20  acc);.  assert( 
13000 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73  strlen(zBuf) < s
13010 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b  izeof(zBuf)-1 );
13020 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13030 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c  declare_vtab(db,
13040 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63   zBuf);.  if( rc
13050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13060 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d     pTab = (Pragm
13070 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d  aVtab*)sqlite3_m
13080 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61  alloc(sizeof(Pra
13090 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69  gmaVtab));.    i
130a0 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
130b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
130c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
130d0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
130e0 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Tab, 0, sizeof(P
130f0 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
13100 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d     pTab->pName =
13110 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20   pPragma;.      
13120 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pTab->db = db;. 
13130 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64       pTab->iHidd
13140 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54  en = i;.      pT
13150 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b  ab->nHidden = j;
13160 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13170 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
13180 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
13190 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
131a0 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a  g(db));.  }..  *
131b0 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
131c0 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20  3_vtab*)pTab;.  
131d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
131e0 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
131f0 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
13200 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74   xDisconnect met
13210 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
13220 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73  nt pragmaVtabDis
13230 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
13240 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
13250 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
13260 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
13270 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
13280 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72  _free(pTab);.  r
13290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
132a0 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75  .}../* Figure ou
132b0 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  t the best index
132c0 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63   to use to searc
132d0 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  h a pragma virtu
132e0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
132f0 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65  There are not re
13300 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63  ally any index c
13310 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20  hoices.  But we 
13320 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67  want to encourag
13330 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70  e the.** query p
13340 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d  lanner to give =
13350 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  = constraints on
13360 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20   as many hidden 
13370 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a  parameters as.**
13380 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65   possible, and e
13390 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65  specially on the
133a0 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61   first hidden pa
133b0 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74  rameter.  So ret
133c0 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f  urn a.** high co
133d0 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72  st if hidden par
133e0 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f  ameters are unco
133f0 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74  nstrained..*/.st
13400 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
13410 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c  tabBestIndex(sql
13420 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20  ite3_vtab *tab, 
13430 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
13440 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20  fo *pIdxInfo){. 
13450 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
13460 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
13470 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74  )tab;.  const st
13480 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13490 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
134a0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
134b0 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65  t i, j;.  int se
134c0 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e  en[2];..  pIdxIn
134d0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
134e0 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
134f0 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64   if( pTab->nHidd
13500 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20  en==0 ){ return 
13510 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70  SQLITE_OK; }.  p
13520 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
13530 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13540 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20  nt;.  seen[0] = 
13550 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30  0;.  seen[1] = 0
13560 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13570 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
13580 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73  aint; i++, pCons
13590 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69  traint++){.    i
135a0 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
135b0 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74  usable==0 ) cont
135c0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
135d0 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53  onstraint->op!=S
135e0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
135f0 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74  TRAINT_EQ ) cont
13600 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
13610 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
13620 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64  mn < pTab->iHidd
13630 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  en ) continue;. 
13640 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69     j = pConstrai
13650 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54  nt->iColumn - pT
13660 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20  ab->iHidden;.   
13670 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29   assert( j < 2 )
13680 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20  ;.    seen[j] = 
13690 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  i+1;.  }.  if( s
136a0 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  een[0]==0 ){.   
136b0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
136c0 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
136d0 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20  le)2147483647;. 
136e0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
136f0 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34  imatedRows = 214
13700 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74  7483647;.    ret
13710 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13720 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d   }.  j = seen[0]
13730 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  -1;.  pIdxInfo->
13740 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13750 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [j].argvIndex = 
13760 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
13770 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
13780 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69  j].omit = 1;.  i
13790 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20  f( seen[1]==0 ) 
137a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
137b0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
137c0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
137d0 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78  ouble)20;.  pIdx
137e0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
137f0 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20  ows = 20;.  j = 
13800 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64  seen[1]-1;.  pId
13810 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13820 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
13830 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78  ndex = 2;.  pIdx
13840 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13850 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
13860 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
13870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72  ITE_OK;.}../* Cr
13880 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
13890 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61  r for the pragma
138a0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
138b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
138c0 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69  gmaVtabOpen(sqli
138d0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
138e0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
138f0 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
13900 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
13910 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43  rsor *pCsr;.  pC
13920 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13930 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f  Cursor*)sqlite3_
13940 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
13950 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73  Csr));.  if( pCs
13960 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
13970 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
13980 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
13990 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43  zeof(PragmaVtabC
139a0 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d  ursor));.  pCsr-
139b0 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56  >base.pVtab = pV
139c0 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  tab;.  *ppCursor
139d0 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a   = &pCsr->base;.
139e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20  OK;.}../* Clear 
13a00 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  all content from
13a10 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
13a20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f  table cursor. */
13a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61  .static void pra
13a40 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13a50 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  ar(PragmaVtabCur
13a60 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
13a70 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  t i;.  sqlite3_f
13a80 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
13a90 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e  ragma);.  pCsr->
13aa0 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66  pPragma = 0;.  f
13ab0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
13ac0 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
13ad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
13ae0 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
13af0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43  zArg[i]);.    pC
13b00 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30  sr->azArg[i] = 0
13b10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73  ;.  }.}../* Clos
13b20 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  e a pragma virtu
13b30 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  al table cursor 
13b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13b50 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71  agmaVtabClose(sq
13b60 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13b70 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d  r *cur){.  Pragm
13b80 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13b90 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13ba0 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72  ursor*)cur;.  pr
13bb0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
13bc0 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c  ear(pCsr);.  sql
13bd0 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b  ite3_free(pCsr);
13be0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13bf0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e  _OK;.}../* Advan
13c00 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69  ce the pragma vi
13c10 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
13c20 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
13c30 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ow */.static int
13c40 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28   pragmaVtabNext(
13c50 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13c60 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13c70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13c80 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
13c90 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
13ca0 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
13cb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13cc0 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  OK;..  /* Increm
13cd0 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76  ent the xRowid v
13ce0 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e  alue */.  pCsr->
13cf0 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65  iRowid++;.  asse
13d00 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d  rt( pCsr->pPragm
13d10 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  a );.  if( SQLIT
13d20 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73  E_ROW!=sqlite3_s
13d30 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  tep(pCsr->pPragm
13d40 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  a) ){.    rc = s
13d50 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13d60 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
13d70 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d      pCsr->pPragm
13d80 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d  a = 0;.    pragm
13d90 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13da0 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCsr);.  }.  re
13db0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
13dc0 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
13dd0 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
13de0 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a  Filter method..*
13df0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13e00 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20  gmaVtabFilter(. 
13e10 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13e20 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13e30 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
13e40 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
13e50 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
13e60 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
13e70 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67  **argv.){.  Prag
13e80 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13e90 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13ea0 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
13eb0 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
13ec0 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
13ed0 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
13ee0 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
13ef0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
13f00 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  j;.  StrAccum ac
13f10 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
13f20 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
13f30 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20  ETER(idxNum);.  
13f40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13f50 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67  (idxStr);.  prag
13f60 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13f70 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28  r(pCsr);.  j = (
13f80 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72  pTab->pName->mPr
13f90 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
13fa0 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20  Result1)!=0 ? 0 
13fb0 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  : 1;.  for(i=0; 
13fc0 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b  i<argc; i++, j++
13fd0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
13fe0 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73  r *zText = (cons
13ff0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
14000 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
14010 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
14020 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73   j<ArraySize(pCs
14030 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20  r->azArg) );.   
14040 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
14050 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20  zArg[j]==0 );.  
14060 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
14070 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67       pCsr->azArg
14080 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [j] = sqlite3_mp
14090 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78  rintf("%s", zTex
140a0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  t);.      if( pC
140b0 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20  sr->azArg[j]==0 
140c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
140d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
140e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
140f0 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
14100 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c  cumInit(&acc, 0,
14110 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d   0, 0, pTab->db-
14120 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
14130 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
14140 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  );.  sqlite3_str
14150 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
14160 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69   "PRAGMA ");.  i
14170 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  f( pCsr->azArg[1
14180 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
14190 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63  _str_appendf(&ac
141a0 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e  c, "%Q.", pCsr->
141b0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20  azArg[1]);.  }. 
141c0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
141d0 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70 54 61  endall(&acc, pTa
141e0 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29  b->pName->zName)
141f0 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a  ;.  if( pCsr->az
14200 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71  Arg[0] ){.    sq
14210 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
14220 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70  f(&acc, "=%Q", p
14230 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a  Csr->azArg[0]);.
14240 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
14250 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
14260 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20  sh(&acc);.  if( 
14270 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
14280 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
142a0 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64  epare_v2(pTab->d
142b0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
142c0 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b  sr->pPragma, 0);
142d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
142e0 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  zSql);.  if( rc!
142f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14300 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
14310 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
14320 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
14330 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62  ite3_errmsg(pTab
14340 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75  ->db));.    retu
14350 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
14360 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65  urn pragmaVtabNe
14370 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  xt(pVtabCursor);
14380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61  .}../*.** Pragma
14390 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
143a0 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f  odule xEof metho
143b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
143c0 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73   pragmaVtabEof(s
143d0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
143e0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
143f0 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
14400 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
14410 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
14420 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72  pVtabCursor;.  r
14430 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72  eturn (pCsr->pPr
14440 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20  agma==0);.}../* 
14450 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  The xColumn meth
14460 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  od simply return
14470 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
14480 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  ing column from.
14490 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20  ** the PRAGMA.  
144a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
144b0 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28  ragmaVtabColumn(
144c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
144d0 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
144e0 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  sor, .  sqlite3_
144f0 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
14500 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67   int i.){.  Prag
14510 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
14520 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
14530 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
14540 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
14550 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
14560 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
14570 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
14580 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64  f( i<pTab->iHidd
14590 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
145a0 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
145b0 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
145c0 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70  mn_value(pCsr->p
145d0 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d  Pragma, i));.  }
145e0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
145f0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
14600 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69  x, pCsr->azArg[i
14610 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c  -pTab->iHidden],
14620 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
14630 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ENT);.  }.  retu
14640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14650 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
14660 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
14670 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f  ule xRowid metho
14680 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14690 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64   pragmaVtabRowid
146a0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
146b0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
146c0 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
146d0 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  *p){.  PragmaVta
146e0 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
146f0 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
14700 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
14710 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f    *p = pCsr->iRo
14720 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
14730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
14740 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  he pragma virtua
14750 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a  l table object *
14760 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
14770 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72  qlite3_module pr
14780 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d  agmaVtabModule =
14790 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
147c0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65  /* xCreate - cre
147f0 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  ate a table */. 
14800 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65   pragmaVtabConne
14810 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
14820 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e   xConnect - conn
14830 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69  ect to an existi
14840 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72  ng table */.  pr
14850 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65  agmaVtabBestInde
14860 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42  x,         /* xB
14870 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72  estIndex - Deter
14880 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61  mine search stra
14890 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61  tegy */.  pragma
148a0 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20  VtabDisconnect, 
148b0 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f         /* xDisco
148c0 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65  nnect - Disconne
148d0 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  ct from a table 
148e0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20    /* xDestroy - 
14910 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a  Drop a table */.
14920 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e    pragmaVtabOpen
14930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14940 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
14950 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61   cursor */.  pra
14960 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20  gmaVtabClose,   
14970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
14980 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
14990 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
149a0 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20  VtabFilter,     
149b0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
149c0 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
149d0 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
149e0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65  /.  pragmaVtabNe
149f0 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
14a00 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
14a10 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
14a20 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c    pragmaVtabEof,
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a40 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67  * xEof */.  prag
14a50 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20  maVtabColumn,   
14a60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
14a70 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
14a80 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52  */.  pragmaVtabR
14a90 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
14aa0 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
14ab0 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  ad data */.  0, 
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
14ae0 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74  date - write dat
14af0 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20      /* xBegin - 
14b20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
14b30 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73      /* xSync - s
14b60 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ync transaction 
14b70 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63    /* xCommit - c
14ba0 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
14bb0 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
14be0 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   - rollback tran
14bf0 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
14c20 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e  ndFunction - fun
14c30 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
14c40 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  g */.  0,       
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d      /* xRename -
14c70 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c   rename the tabl
14c80 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
14cb0 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
14ce0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
14d10 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d     /* xShadowNam
14d40 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  e */.};../*.** C
14d50 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a  heck to see if z
14d60 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c  TabName is reall
14d70 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  y the name of a 
14d80 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69  pragma.  If it i
14d90 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73  s,.** then regis
14da0 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73  ter an eponymous
14db0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66   virtual table f
14dc0 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61  or that pragma a
14dd0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  nd return.** a p
14de0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f  ointer to the Mo
14df0 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  dule object for 
14e00 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  the new virtual 
14e10 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65  table..*/.Module
14e20 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56   *sqlite3PragmaV
14e30 74 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69  tabRegister(sqli
14e40 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
14e50 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63  har *zName){.  c
14e60 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
14e70 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  *pName;.  assert
14e80 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
14e90 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
14ea0 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20  a_", 7)==0 );.  
14eb0 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f  pName = pragmaLo
14ec0 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20  cate(zName+7);. 
14ed0 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20   if( pName==0 ) 
14ee0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14ef0 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67  (pName->mPragFlg
14f00 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75   & (PragFlg_Resu
14f10 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75  lt0|PragFlg_Resu
14f20 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72  lt1))==0 ) retur
14f30 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  n 0;.  assert( s
14f40 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
14f50 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61  db->aModule, zNa
14f60 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  me)==0 );.  retu
14f70 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72  rn sqlite3VtabCr
14f80 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a  eateModule(db, z
14f90 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61  Name, &pragmaVta
14fa0 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29  bModule, (void*)
14fb0 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65  pName, 0);.}..#e
14fc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14fd0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14fe0 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
14ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
15000 41 20 2a 2f 0a                                   A */.