/ Hex Artifact Content
Login

Artifact a6ad736f960ab2bba79ce96c5d5a2f8f2e841258900d6a436565c14839f0fc08:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  K );.    while( 
1ba0: 28 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20  (n--) > 0 ){.   
1bb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1bc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
1be0: 6c 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20  lags(pDb->pBt,. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  (pDb->safety_lev
1c10: 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  el & PAGER_SYNCH
1c20: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 0a 20 20 20  RONOUS_MASK).   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1c50: 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1c60: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c70: 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pDb++;.    }. 
1c80: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1c90: 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72 46  ine setAllPagerF
1ca0: 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d 6f  lags(X)  /* no-o
1cb0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
1cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75 6d  .** Return a hum
1cd0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d 65  an-readable name
1ce0: 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   for a constrain
1cf0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63 74  t resolution act
1d00: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
1d20: 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20 63  IGN_KEY.static c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69 6f  onst char *actio
1d40: 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e 29  nName(u8 action)
1d50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d60: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
1d70: 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 63   action ){.    c
1d80: 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a 20  ase OE_SetNull: 
1d90: 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e 55   zName = "SET NU
1da0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
1db0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53  k;.    case OE_S
1dc0: 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20 3d  etDflt:  zName =
1dd0: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b 20   "SET DEFAULT"; 
1de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1df0: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
1e00: 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41 44   zName = "CASCAD
1e10: 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  E";         brea
1e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  k;.    case OE_R
1e30: 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20 3d  estrict: zName =
1e40: 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20 20   "RESTRICT";    
1e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1e60: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1e70: 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43 54   zName = "NO ACT
1e80: 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20 20  ION";  .        
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ea0: 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f 45  sert( action==OE
1eb0: 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b 0a  _None ); break;.
1ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
1ed0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
1ee0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
1ef0: 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
1f00: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
1f10: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63 6f  URNALMODE_XXX co
1f20: 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69 6e  nstants.** defin
1f30: 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20 54  ed in pager.h. T
1f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f50: 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69 61  urns the associa
1f60: 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a 2a  ted lowercase.**
1f70: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e 61   journal-mode na
1f80: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
1f90: 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  r *sqlite3Journa
1fa0: 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65 4d  lModename(int eM
1fb0: 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ode){.  static c
1fc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d 6f  har * const azMo
1fd0: 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  deName[] = {.   
1fe0: 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72 73   "delete", "pers
1ff0: 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74 72  ist", "off", "tr
2000: 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72 79  uncate", "memory
2010: 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 2c  _OMIT_WAL.     ,
2030: 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20 20   "wal".#endif.  
2040: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  };.  assert( PAG
2050: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2060: 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61 73  ELETE==0 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3d  NALMODE_PERSIST=
2090: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b0: 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61 73  E_OFF==2 );.  as
20c0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20d0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20e0: 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
20f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2100: 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b 0a  DE_MEMORY==4 );.
2110: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3d  JOURNALMODE_WAL=
2130: 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
2140: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
2150: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
2160: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
2170: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
2180: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
2190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21a0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
21b0: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
21c0: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
21d0: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
21e0: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2200: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2210: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2220: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2230: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2240: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
2250: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
2260: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
2270: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
2280: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
2290: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
22c0: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
22d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
22e0: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
22f0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2300: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2310: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2320: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2330: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2340: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
2350: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
2360: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
2370: 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75 74  * Helper subrout
2380: 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20 69  ine for PRAGMA i
2390: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a 0a  ntegrity_check:.
23a0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  **.** Generate c
23b0: 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61 20  ode to output a 
23c0: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72 65  single-column re
23d0: 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61 20  sult row with a 
23e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
23f0: 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20 72  string held in r
2400: 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63 72  egister 3.  Decr
2410: 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74  ement the result
2420: 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73 74   count in regist
2430: 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c 74  er 1.** and halt
2440: 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   if the maximum 
2450: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2460: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2470: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2480: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
2490: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24a0: 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61 64  be *v){.  int ad
24b0: 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dr;.  sqlite3Vdb
24c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
24d0: 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a  sultRow, 3, 1);.
24e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
24f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2500: 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69 74  _IfPos, 1, sqlit
2510: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2520: 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56 64  r(v)+2, 1);.  Vd
2530: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2550: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
2560: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
2580: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
2590: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
25a0: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
25b0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
25c0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
25d0: 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a  ]id [= value].**
25e0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
25f0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
2600: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
2610: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
2620: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
2630: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
2640: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
2650: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2660: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
2670: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
2680: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
2690: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
26a0: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
26b0: 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69  e is "database.i
26c0: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
26d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
26e0: 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73  e.** and pId2 is
26f0: 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65   the id.  If the
2700: 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75   left side is ju
2710: 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64  st "id" then pId
2720: 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61  1 is the.** id a
2730: 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65  nd pId2 is any e
2740: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
2750: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67  void sqlite3Prag
2760: 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ma(.  Parse *pPa
2770: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
2780: 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  Id1,        /* F
2790: 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73 63  irst part of [sc
27a0: 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a  hema.]id field *
27b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c  /.  Token *pId2,
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
27d0: 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  d part of [schem
27e0: 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20  a.]id field, or 
27f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
2800: 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a  *pValue,      /*
2810: 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75   Token for <valu
2820: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2830: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20 20   int minusFlag  
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2850: 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63 65  a '-' sign prece
2860: 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29  ded <value> */.)
2870: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20  {.  char *zLeft 
2880: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2890: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28a0: 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a  -8 string <id> *
28b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  /.  char *zRight
28c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
28d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
28e0: 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65  -8 string <value
28f0: 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  >, or NULL */.  
2900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
2910: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  = 0;   /* The da
2920: 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
2930: 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20   Token *pId;    
2940: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2950: 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e  er to <id> token
2960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63 6e   */.  char *aFcn
2970: 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20  tl[4];       /* 
2980: 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49  Argument to SQLI
2990: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
29a0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
29c0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66 6f  atabase index fo
29d0: 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a  r <database> */.
29e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * return value f
2a10: 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  orm SQLITE_FCNTL
2a20: 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c  _PRAGMA */.  sql
2a30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2a40: 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65  e->db;    /* The
2a50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a60: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2a70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2a80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
2a90: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
2aa0: 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a  being pragmaed *
2ab0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
2ac0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2ad0: 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72  rse);  /* Prepar
2ae0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
2af0: 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
2b00: 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f  me *pPragma;   /
2b10: 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  * The pragma */.
2b20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2b30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
2b40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76  dbeRunOnlyOnce(v
2b50: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  );.  pParse->nMe
2b60: 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74  m = 2;..  /* Int
2b70: 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68 65  erpret the [sche
2b80: 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68 65  ma.] part of the
2b90: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
2ba0: 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20 20  t. iDb is the.  
2bb0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
2bc0: 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70 72  database this pr
2bd0: 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61 70  agma is being ap
2be0: 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e 61  plied to in db.a
2bf0: 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d  Db[]. */.  iDb =
2c00: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
2c10: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64 31  ame(pParse, pId1
2c20: 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a 20  , pId2, &pId);. 
2c30: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
2c40: 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  urn;.  pDb = &db
2c50: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f  ->aDb[iDb];..  /
2c60: 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64 61  * If the temp da
2c70: 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
2c80: 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64  explicitly named
2c90: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2ca0: 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61  .  ** pragma, ma
2cb0: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f 70  ke sure it is op
2cc0: 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  en. .  */.  if( 
2cd0: 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  iDb==1 && sqlite
2ce0: 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
2cf0: 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  e(pParse) ){.   
2d00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2d10: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 4e  zLeft = sqlite3N
2d20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2d30: 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c   pId);.  if( !zL
2d40: 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  eft ) return;.  
2d50: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
2d60: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2d70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2d80: 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29 3b   "-%T", pValue);
2d90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
2da0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e 61  ight = sqlite3Na
2db0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
2dc0: 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  pValue);.  }..  
2dd0: 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b 0a  assert( pId2 );.
2de0: 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e    zDb = pId2->n>
2df0: 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  0 ? pDb->zDbSNam
2e00: 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  e : 0;.  if( sql
2e10: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2e20: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41  arse, SQLITE_PRA
2e30: 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67  GMA, zLeft, zRig
2e40: 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ht, zDb) ){.    
2e50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
2e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20  .  }..  /* Send 
2e70: 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  an SQLITE_FCNTL_
2e80: 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74  PRAGMA file-cont
2e90: 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65 72  rol to the under
2ea0: 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63  lying VFS.  ** c
2eb0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 69  onnection.  If i
2ec0: 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
2ed0: 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  _OK, then assume
2ee0: 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20 20   that the VFS.  
2ef0: 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20 70  ** handled the p
2f00: 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72 61  ragma and genera
2f10: 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61  te a no-op prepa
2f20: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
2f30: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2f40: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32  NTATION-OF: R-12
2f50: 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65 76  238-55120 Whenev
2f60: 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61 74  er a PRAGMA stat
2f70: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
2f80: 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f  .  ** an SQLITE_
2f90: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c  FCNTL_PRAGMA fil
2fa0: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e  e control is sen
2fb0: 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73 71  t to the open sq
2fc0: 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20  lite3_file.  ** 
2fd0: 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
2fe0: 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ding to the data
2ff0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68 69  base file to whi
3000: 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20 20  ch the pragma.  
3010: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66  ** statement ref
3020: 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ers..  **.  ** I
3030: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
3040: 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38 20  : R-29875-31678 
3050: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
3060: 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
3070: 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c  _PRAGMA.  ** fil
3080: 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20  e control is an 
3090: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
30a0: 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63 68  s to strings (ch
30b0: 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20 74  ar**) in which t
30c0: 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65  he.  ** second e
30d0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 72  lement of the ar
30e0: 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ray is the name 
30f0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61 6e  of the pragma an
3100: 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a 2a  d the third.  **
3110: 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
3120: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3130: 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69  pragma or NULL i
3140: 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61 73  f the pragma has
3150: 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e   no.  ** argumen
3160: 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c  t..  */.  aFcntl
3170: 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74  [0] = 0;.  aFcnt
3180: 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  l[1] = zLeft;.  
3190: 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67  aFcntl[2] = zRig
31a0: 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20  ht;.  aFcntl[3] 
31b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
31c0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
31d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
31e0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
31f0: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
3200: 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69  NTL_PRAGMA, (voi
3210: 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66  d*)aFcntl);.  if
3220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3230: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
3240: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
3250: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3260: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3270: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
3280: 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c  , aFcntl[0], SQL
3290: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
32a0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
32b0: 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30  Text(v, aFcntl[0
32c0: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
32d0: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
32e0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
32f0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
3300: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
3310: 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 61  UND ){.    if( a
3320: 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  Fcntl[0] ){.    
3330: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3340: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
3350: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
3360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
3370: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  Fcntl[0]);.    }
3380: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
3390: 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  r++;.    pParse-
33a0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f  >rc = rc;.    go
33b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
33c0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
33d0: 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74 68  the pragma in th
33e0: 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a  e lookup table *
33f0: 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70 72  /.  pPragma = pr
3400: 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74  agmaLocate(zLeft
3410: 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  );.  if( pPragma
3420: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  ==0 ) goto pragm
3430: 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  a_out;..  /* Mak
3440: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
3450: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c 6f  ase schema is lo
3460: 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61 67  aded if the prag
3470: 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ma requires that
3480: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67   */.  if( (pPrag
3490: 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  ma->mPragFlg & P
34a0: 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d  ragFlg_NeedSchem
34b0: 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  a)!=0 ){.    if(
34c0: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
34d0: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
34e0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
34f0: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
3500: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
3510: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72 61  mn names for pra
3520: 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72 6e  gmas that return
3530: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66   results */.  if
3540: 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  ( (pPragma->mPra
3550: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
3560: 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20  oColumns)==0 .  
3570: 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d   && ((pPragma->m
3580: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
3590: 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30  g_NoColumns1)==0
35a0: 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20   || zRight==0). 
35b0: 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67 6d   ){.    setPragm
35c0: 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d  aResultColumnNam
35d0: 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a  es(v, pPragma);.
35e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
35f0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
3600: 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65 72  e pragma handler
3610: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 50   */.  switch( pP
3620: 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 20  ragma->ePragTyp 
3630: 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ){.  .#if !defin
3640: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
3650: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26 26  AGER_PRAGMAS) &&
3660: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3670: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
3680: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
3690: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66  GMA [schema.]def
36a0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
36b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
36c0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
36d0: 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a  che_size=N.  **.
36e0: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
36f0: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
3700: 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65  current persiste
3710: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
3720: 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
3730: 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61  he size.  The va
3740: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
3750: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3760: 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73  er of.  ** pages
3770: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
3780: 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  he.  The second 
3790: 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74  form sets both t
37a0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
37b0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
37c0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65  value and the pe
37d0: 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61  rsistent page ca
37e0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20  che size value. 
37f0: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
3800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72  .  **.  ** Older
3820: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
3830: 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74 68  ite would set th
3840: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 20  e default cache 
3850: 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e  size to a.  ** n
3860: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 74  egative number t
3870: 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63 68  o indicate synch
3880: 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65  ronous=OFF.  The
3890: 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72 6f  se days, synchro
38a0: 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77  nous.  ** is alw
38b0: 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c  ays on by defaul
38c0: 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  t regardless of 
38d0: 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65 20  the sign of the 
38e0: 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20  default cache.  
38f0: 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63 6f  ** size.  But co
3900: 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20 74  ntinue to take t
3910: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
3920: 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  e of the default
3930: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3940: 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20 63   of historical c
3950: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20  ompatibility..  
3960: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
3970: 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  p_DEFAULT_CACHE_
3980: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61 74  SIZE: {.    stat
3990: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
39a0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
39b0: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
39c0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
39d0: 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53 69  pList getCacheSi
39e0: 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ze[] = {.      {
39f0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
3a00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2a            /* 0 *
3a30: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  /.      { OP_Rea
3a40: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20  dCookie,  0, 1, 
3a50: 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45 46         BTREE_DEF
3a60: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d  AULT_CACHE_SIZE}
3a70: 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  ,  /* 1 */.     
3a80: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
3a90: 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20     1, 8,        
3aa0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
3ab0: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 32  nteger,     0, 2
3ac0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3ad0: 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63 74     { OP_Subtract
3ae0: 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20  ,    1, 2,      
3af0: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
3b00: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
3b10: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
3b20: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
3b30: 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  r,     0, 1,    
3b40: 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20      0},         
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
3b70: 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
3b80: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
3b90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75  .      { OP_Resu
3ba0: 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20  ltRow,   1, 1,  
3bb0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
3bc0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  .    VdbeOp *aOp
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3be0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
3bf0: 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  b);.    if( !zRi
3c00: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ght ){.      pPa
3c10: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
3c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3c30: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
3c40: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
3c50: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
3c60: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
3c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c80: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
3c90: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
3ca0: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c 20  , getCacheSize, 
3cb0: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  iLn);.      if( 
3cc0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
3cd0: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
3ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f   break;.      aO
3cf0: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
3d00: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d       aOp[1].p1 =
3d10: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
3d20: 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f 44  6].p1 = SQLITE_D
3d30: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
3d40: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
3d50: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 73      int size = s
3d60: 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 73  qlite3AbsInt32(s
3d70: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
3d80: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
3d90: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
3da0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3db0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
3dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3dd0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
3de0: 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41 55  iDb, BTREE_DEFAU
3df0: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 73  LT_CACHE_SIZE, s
3e00: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
3e10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3e20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3e30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
3e40: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
3e50: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
3e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
3e70: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
3e80: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
3e90: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
3ea0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
3eb0: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
3ec0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3ed0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 26  _PAGER_PRAGMAS &
3ee0: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  & !SQLITE_OMIT_D
3ef0: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69  EPRECATED */..#i
3f00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3f10: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
3f20: 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  GMAS).  /*.  ** 
3f30: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f40: 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  ]page_size.  ** 
3f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
3f60: 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  ]page_size=N.  *
3f70: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
3f80: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
3f90: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
3fa0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64  g for the.  ** d
3fb0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
3fc0: 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  e in bytes.  The
3fd0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
3fe0: 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  s the.  ** datab
3ff0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76 61  ase page size va
4000: 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  lue.  The value 
4010: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  can only be set 
4020: 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  if.  ** the data
4030: 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65 74  base has not yet
4040: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a 20   been created.. 
4050: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
4060: 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a  yp_PAGE_SIZE: {.
4070: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4080: 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61   pDb->pBt;.    a
4090: 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b  ssert( pBt!=0 );
40a0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
40b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69   ){.      int si
40c0: 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74 29  ze = ALWAYS(pBt)
40d0: 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   ? sqlite3BtreeG
40e0: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 20  etPageSize(pBt) 
40f0: 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  : 0;.      retur
4100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69  nSingleInt(v, si
4110: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
4120: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20        /* Malloc 
4130: 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73 65  may fail when se
4140: 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d 73  tting the page-s
4150: 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69 73  ize, as there is
4160: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20   an internal.   
4170: 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68 61     ** buffer tha
4180: 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64 75  t the pager modu
4190: 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e 67  le resizes using
41a0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
41b0: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
41c0: 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73     db->nextPages
41d0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  ize = sqlite3Ato
41e0: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
41f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
4200: 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
4210: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
4220: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4230: 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  ,-1,0) ){.      
4240: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
4250: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t(db);.      }. 
4260: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
4270: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4280: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4290: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
42a0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
42b0: 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65 74  ma.]secure_delet
42c0: 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20 20  e=ON/OFF/FAST.  
42d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
42e0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
42f0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4300: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
4310: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c  secure_delete fl
4320: 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ag.  The second 
4330: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
4340: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
4350: 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67   ** flag setting
4360: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65   and reports the
4370: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f   new value..  */
4380: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4390: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b  SECURE_DELETE: {
43a0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
43b0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
43c0: 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20  int b = -1;.    
43d0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
43e0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
43f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
4400: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 52  lite3_stricmp(zR
4410: 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d 30  ight, "fast")==0
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   ){.        b = 
4430: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
4440: 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69          b = sqli
4450: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
4460: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
4470: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4480: 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e  pId2->n==0 && b>
4490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
44a0: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
44b0: 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
44c0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
44d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
44e0: 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b  eDelete(db->aDb[
44f0: 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20  ii].pBt, b);.   
4500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
4510: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
4520: 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c  ecureDelete(pBt,
4530: 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53   b);.    returnS
4540: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a  ingleInt(v, b);.
4550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4560: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
4580: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  age_count.  **  
4590: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
45a0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
45b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
45c0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
45d0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
45e0: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
45f0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
4600: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4610: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
4620: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
4630: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
4640: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
4650: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
4660: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
4670: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4680: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
4690: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
46a0: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
46b0: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
46c0: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
46d0: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
46e0: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
46f0: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
4700: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
4710: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
4720: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
4730: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
4740: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4750: 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a  .]page_count.  *
4760: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
4770: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
4780: 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
4790: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
47a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
47b0: 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  _PAGE_COUNT: {. 
47c0: 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20     int iReg;.   
47d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
47e0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
47f0: 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20   iDb);.    iReg 
4800: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4810: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4820: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
4830: 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  ])=='p' ){.     
4840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4850: 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75  p2(v, OP_Pagecou
4860: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a  nt, iDb, iReg);.
4870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4890: 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e  p3(v, OP_MaxPgcn
48a0: 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20  t, iDb, iReg, . 
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
48d0: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
48e0: 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20  oi(zRight)));.  
48f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
4900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4910: 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c  ResultRow, iReg,
4920: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
4930: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
4940: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4950: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
4960: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4970: 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  a.]locking_mode 
4980: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
4990: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
49a0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
49b0: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
49c0: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
49d0: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
49e0: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
49f0: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
4a00: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
4a10: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
4a20: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4a30: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
4a40: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
4a50: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
4a60: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
4a70: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
4a80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
4a90: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
4aa0: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4ab0: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4ac0: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4ad0: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4ae0: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4af0: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4b00: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4b10: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4b40: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
4b50: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
4b60: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
4b70: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
4b80: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
4b90: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
4ba0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4bb0: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4bc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4bd0: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4be0: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4bf0: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4c00: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4c10: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4c20: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4c30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4c40: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
4c50: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
4c60: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
4c70: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
4c80: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
4c90: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
4ca0: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4cb0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4cc0: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4cd0: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4ce0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4cf0: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4d00: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4d10: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4d20: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4d30: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4d40: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
4d50: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
4d60: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
4d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d80: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
4d90: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
4da0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4db0: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4dc0: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4dd0: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4de0: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4df0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4e00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4e10: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4e20: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4e30: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4e40: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4e80: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4e90: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4ea0: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4eb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4ec0: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4ed0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4ee0: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4ef0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4f00: 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74  ngleText(v, zRet
4f10: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4f20: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4f30: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4f40: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20  urnal_mode.  ** 
4f50: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4f60: 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a  ]journal_mode =.
4f70: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
4f80: 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74            (delet
4f90: 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72  e|persist|off|tr
4fa0: 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61  uncate|memory|wa
4fb0: 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61  l|off).  */.  ca
4fc0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
4fd0: 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69  AL_MODE: {.    i
4fe0: 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt eMode;       
4ff0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
5000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
5010: 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  _XXX symbols */.
5020: 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
5030: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5040: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66  unter */..    if
5050: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
5060: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
5070: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
5080: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
5090: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
50a0: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
50b0: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
50c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
50d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
50e0: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
50f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5100: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
5110: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5120: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
5130: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
5140: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
5150: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
5160: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
5170: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
5180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5190: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
51a0: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
51b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
51c0: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
51d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
51e0: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
51f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
5200: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
5210: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
5220: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
5230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
5240: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
5250: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
5260: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5270: 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  f( eMode==PAGER_
5280: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5290: 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20  Y && pId2->n==0 
52a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ){.      /* Conv
52b0: 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ert "PRAGMA jour
52c0: 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22  nal_mode" into "
52d0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
52e0: 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20  nal_mode" */.   
52f0: 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20     iDb = 0;.    
5300: 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20    pId2->n = 1;. 
5310: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
5320: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30  db->nDb-1; ii>=0
5330: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; ii--){.      i
5340: 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  f( db->aDb[ii].p
5350: 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c  Bt && (ii==iDb |
5360: 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b  | pId2->n==0) ){
5370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5380: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5390: 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71   ii);.        sq
53a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
53b0: 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  v, OP_JournalMod
53c0: 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29  e, ii, 1, eMode)
53d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
53e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
5400: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
5410: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
5420: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5430: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
5440: 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _size_limit.  **
5450: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5460: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5470: 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  imit=N.  **.  **
5480: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5490: 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f  size limit on ro
54a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
54b0: 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  iles..  */.  cas
54c0: 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41  e PragTyp_JOURNA
54d0: 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a  L_SIZE_LIMIT: {.
54e0: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
54f0: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
5500: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
5510: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
5520: 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52  = -2;.    if( zR
5530: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
5540: 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
5550: 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  64(zRight, &iLim
5560: 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  it);.      if( i
5570: 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69  Limit<-1 ) iLimi
5580: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  t = -1;.    }.  
5590: 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    iLimit = sqlit
55a0: 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
55b0: 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20  zeLimit(pPager, 
55c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74  iLimit);.    ret
55d0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
55e0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65  iLimit);.    bre
55f0: 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20  ak;.  }..#endif 
5600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
5610: 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  AGER_PRAGMAS */.
5620: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
5630: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f  MA [schema.]auto
5640: 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52  _vacuum.  **  PR
5650: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75  AGMA [schema.]au
5660: 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a  to_vacuum=N.  **
5670: 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74  .  ** Get or set
5680: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5690: 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74 6f  e database 'auto
56a0: 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74  -vacuum' paramet
56b0: 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  er..  ** The val
56c0: 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30  ue is one of:  0
56d0: 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49   NONE 1 FULL 2 I
56e0: 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a  NCREMENTAL.  */.
56f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5700: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
5710: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 55   case PragTyp_AU
5720: 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20  TO_VACUUM: {.   
5730: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
5740: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
5750: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
5760: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
5770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
5780: 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
5790: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
57a0: 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  uum(pBt));.    }
57b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
57c0: 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56  eAuto = getAutoV
57d0: 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20  acuum(zRight);. 
57e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41 75       assert( eAu
57f0: 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d  to>=0 && eAuto<=
5800: 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  2 );.      db->n
5810: 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38  extAutovac = (u8
5820: 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a  )eAuto;.      /*
5830: 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63   Call SetAutoVac
5840: 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69  uum() to set ini
5850: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65  tialize the inte
5860: 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20  rnal auto and.  
5870: 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75      ** incr-vacu
5880: 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69  um flags. This i
5890: 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
58a0: 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  se this connecti
58b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  on.      ** crea
58c0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
58d0: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70   file. It is imp
58e0: 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20 69  ortant that it i
58f0: 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20  s created.      
5900: 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61  ** as an auto-va
5910: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e  cuum capable db.
5920: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5930: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5940: 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70  eSetAutoVacuum(p
5950: 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20  Bt, eAuto);.    
5960: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5970: 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31  _OK && (eAuto==1
5980: 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b   || eAuto==2) ){
5990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  .        /* When
59a0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74   setting the aut
59b0: 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f  o_vacuum mode to
59c0: 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f   either "full" o
59d0: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69  r .        ** "i
59e0: 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69  ncremental", wri
59f0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
5a00: 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64  meta[6] in the d
5a10: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
5a20: 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20  ** file. Before 
5a30: 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b  writing to meta[
5a40: 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d  6], check that m
5a50: 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73  eta[3] indicates
5a60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
5a70: 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   this really is 
5a80: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  an auto-vacuum c
5a90: 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e  apable database.
5aa0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5ab0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5ac0: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
5ad0: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
5ae0: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  ;.        static
5af0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
5b00: 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b  t setMeta6[] = {
5b10: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5b20: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
5b30: 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20  0,         1,   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
5b50: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
5b60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
5b70: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20  Cookie,     0,  
5b80: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5b90: 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f    BTREE_LARGEST_
5ba0: 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20  ROOT_PAGE},.    
5bb0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20        { OP_If,  
5bc0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
5bd0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
5be0: 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20           0},    
5bf0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 2 */.        
5c00: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
5c10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
5c20: 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20  , OE_Abort,     
5c30: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33       0},    /* 3
5c40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
5c50: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
5c60: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42 54     0,         BT
5c70: 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c  REE_INCR_VACUUM,
5c80: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
5c90: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
5ca0: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
5cb0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
5cc0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
5cd0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5cf0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5d00: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
5d10: 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29  ySize(setMeta6))
5d20: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20  ;.        aOp = 
5d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d40: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
5d50: 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74  e(setMeta6), set
5d60: 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20  Meta6, iLn);.   
5d70: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
5d80: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
5d90: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
5da0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
5db0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5dc0: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
5dd0: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  b;.        aOp[2
5de0: 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a  ].p2 = iAddr+4;.
5df0: 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70          aOp[4].p
5e00: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20  1 = iDb;.       
5e10: 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75   aOp[4].p3 = eAu
5e20: 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  to - 1;.        
5e30: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5e40: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
5e50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5e60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
5e70: 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  f..  /*.  **  PR
5e80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e  AGMA [schema.]in
5e90: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
5ea0: 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f  (N).  **.  ** Do
5eb0: 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72   N steps of incr
5ec0: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e  emental vacuumin
5ed0: 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e  g on a database.
5ee0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
5ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5f00: 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67  CUUM.  case Prag
5f10: 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f  Typ_INCREMENTAL_
5f20: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e  VACUUM: {.    in
5f30: 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a  t iLimit, addr;.
5f40: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d      if( zRight==
5f50: 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74  0 || !sqlite3Get
5f60: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69  Int32(zRight, &i
5f70: 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74  Limit) || iLimit
5f80: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  <=0 ){.      iLi
5f90: 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66 66  mit = 0x7fffffff
5fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5fb0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
5fc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
5fd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
5fe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ff0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69   OP_Integer, iLi
6000: 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  mit, 1);.    add
6010: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6020: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72  ddOp1(v, OP_Incr
6030: 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64  Vacuum, iDb); Vd
6040: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6060: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp1(v, OP_Resul
6070: 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71  tRow, 1);.    sq
6080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6090: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
60a0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
60b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
60c0: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72  P_IfPos, 1, addr
60d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
60e0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
60f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
6100: 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ddr);.    break;
6110: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
6120: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6130: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20  _PAGER_PRAGMAS. 
6140: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
6150: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6160: 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
6190: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
61a0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
61b0: 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69  rent local setti
61c0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
61d0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
61e0: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
61f0: 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
6200: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6210: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20  size value.  If 
6220: 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68  N is positive th
6230: 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  en that is the. 
6240: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6250: 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
6260: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6270: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ive, then the.  
6280: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6290: 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73  es is adjusted s
62a0: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
62b0: 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74   uses -N kibibyt
62c0: 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72  es.  ** of memor
62d0: 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  y..  */.  case P
62e0: 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a  ragTyp_CACHE_SIZ
62f0: 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E: {.    assert(
6300: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
6310: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
6320: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21   0) );.    if( !
6330: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
6340: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
6350: 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  v, pDb->pSchema-
6360: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
6370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6380: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
6390: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
63a0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
63b0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  a->cache_size = 
63c0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
63d0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
63e0: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
63f0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
6400: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
6410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6420: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6430: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6440: 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41  _spill.  **  PRA
6450: 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  GMA cache_spill=
6460: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52  BOOLEAN.  **  PR
6470: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61  AGMA [schema.]ca
6480: 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a  che_spill=N.  **
6490: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
64a0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
64b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
64c0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
64d0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
64e0: 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73  pill size. The s
64f0: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73  econd form turns
6500: 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a   cache spill on.
6510: 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68    ** or off.  Wh
6520: 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68  en turnning cach
6530: 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20  e spill on, the 
6540: 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
6550: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
6560: 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65  cache_size.  The
6570: 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73   third form sets
6580: 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68   a spill size th
6590: 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64  at.  ** may be d
65a0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68  ifferent form th
65b0: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  e cache size..  
65c0: 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74  ** If N is posit
65d0: 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69 73  ive then that is
65e0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
65f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6600: 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73   cache.  If N is
6610: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
6620: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
6630: 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a 75  of pages is adju
6640: 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  sted so that the
6650: 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b   cache uses -N k
6660: 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66  ibibytes.  ** of
6670: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20   memory..  **.  
6680: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
6690: 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20   of cache_spill 
66a0: 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74 68  pages is less th
66b0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
66c0: 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65  .  ** cache_size
66d0: 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c   pages, no spill
66e0: 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c  ing occurs until
66f0: 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20   the page count 
6700: 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65  exceeds.  ** the
6710: 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
6720: 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a  _size pages..  *
6730: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65  *.  ** The cache
6740: 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73  _spill=BOOLEAN s
6750: 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74  etting applies t
6760: 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73  o all attached s
6770: 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74  chemas,.  ** not
6780: 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d 61   just the schema
6790: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f   specified..  */
67a0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
67b0: 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20  CACHE_SPILL: {. 
67c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
67d0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
67e0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
67f0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
6800: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6810: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20  SingleInt(v,.   
6820: 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73        (db->flags
6830: 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   & SQLITE_CacheS
6840: 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a  pill)==0 ? 0 : .
6850: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6860: 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
6870: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29  Size(pDb->pBt,0)
6880: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6890: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31      int size = 1
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
68b0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67  te3GetInt32(zRig
68c0: 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20  ht, &size) ){.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
68e0: 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70  eeSetSpillSize(p
68f0: 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a  Db->pBt, size);.
6900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6910: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
6920: 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65  ean(zRight, size
6930: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
6940: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
6950: 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a  ITE_CacheSpill;.
6960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6970: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
6980: 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 43  = ~(u64)SQLITE_C
6990: 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20  acheSpill;.     
69a0: 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50   }.      setAllP
69b0: 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20  agerFlags(db);. 
69c0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
69d0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
69e0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
69f0: 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20 20 2a  mmap_size(N).  *
6a00: 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f 20 73  *.  ** Used to s
6a10: 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  et mapping size 
6a20: 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70 70 69  limit. The mappi
6a30: 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20 69 73  ng size limit is
6a40: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 6c 69  .  ** used to li
6a50: 6d 69 74 20 74 68 65 20 61 67 67 72 65 67 61 74  mit the aggregat
6a60: 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 6d 65  e size of all me
6a70: 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67 69  mory mapped regi
6a80: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
6a90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
6aa0: 66 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  f this parameter
6ab0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c   is set to zero,
6ac0: 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 70   then memory map
6ad0: 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ping.  ** is not
6ae0: 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20 20 49   used at all.  I
6af0: 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65 2c  f N is negative,
6b00: 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75 6c   then the defaul
6b10: 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20 2a  t memory map.  *
6b20: 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d 69 6e  * limit determin
6b30: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f  ed by sqlite3_co
6b40: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
6b50: 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20 69 73  IG_MMAP_SIZE) is
6b60: 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65 20 70   set..  ** The p
6b70: 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20 6d 65  arameter N is me
6b80: 61 73 75 72 65 64 20 69 6e 20 62 79 74 65 73 2e  asured in bytes.
6b90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
6ba0: 76 61 6c 75 65 20 69 73 20 61 64 76 69 73 6f 72  value is advisor
6bb0: 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c 79 69  y.  The underlyi
6bc0: 6e 67 20 56 46 53 20 69 73 20 66 72 65 65 20 74  ng VFS is free t
6bd0: 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20 2a  o memory map.  *
6be0: 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72 20 61  * as little or a
6bf0: 73 20 6d 75 63 68 20 61 73 20 69 74 20 77 61 6e  s much as it wan
6c00: 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ts.  Except, if 
6c10: 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20 74 68  N is set to 0 th
6c20: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70 70 65  en the.  ** uppe
6c30: 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20 6e 65  r layers will ne
6c40: 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20 78  ver invoke the x
6c50: 46 65 74 63 68 20 69 6e 74 65 72 66 61 63 65 73  Fetch interfaces
6c60: 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20 20 2a   to the VFS..  *
6c70: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6c80: 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
6c90: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
6ca0: 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  sz;.#if SQLITE_M
6cb0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
6cc0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
6cd0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
6ce0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
6cf0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
6d00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
6d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
6d20: 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
6d30: 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  ht, &sz);.      
6d40: 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20 3d 20  if( sz<0 ) sz = 
6d50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
6d60: 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  fig.szMmap;.    
6d70: 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30    if( pId2->n==0
6d80: 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20   ) db->szMmap = 
6d90: 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  sz;.      for(ii
6da0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
6db0: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
6dc0: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69    if( db->aDb[ii
6dd0: 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44  ].pBt && (ii==iD
6de0: 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29  b || pId2->n==0)
6df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6e00: 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
6e10: 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62 5b 69  pLimit(db->aDb[i
6e20: 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20 20 20  i].pBt, sz);.   
6e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6e40: 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 2d 31     }.    sz = -1
6e50: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
6e60: 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
6e70: 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
6e80: 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
6e90: 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20   &sz);.#else.   
6ea0: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72 63 20   sz = 0;.    rc 
6eb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  = SQLITE_OK;.#en
6ec0: 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  dif.    if( rc==
6ed0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6ee0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6ef0: 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20 20 7d  nt(v, sz);.    }
6f00: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
6f10: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
6f20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
6f30: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  rr++;.      pPar
6f40: 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
6f50: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
6f60: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
6f70: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
6f80: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
6f90: 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64 65 66  emp_store = "def
6fa0: 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22 7c 22  ault"|"memory"|"
6fb0: 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file".  **.  ** 
6fc0: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
6fd0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
6fe0: 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 20   the temp_store 
6ff0: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7000: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76    ** the local v
7010: 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  alue does not ma
7020: 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ke changes to th
7030: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20  e disk file and 
7040: 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a  the default.  **
7050: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
7060: 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74  estored the next
7070: 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
7080: 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a 20 20  se is opened..  
7090: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
70a0: 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  t it is possible
70b0: 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72 79   for the library
70c0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
70d0: 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20 6f 76  tions to.  ** ov
70e0: 65 72 72 69 64 65 20 74 68 69 73 20 73 65 74 74  erride this sett
70f0: 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ing.  */.  case 
7100: 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f  PragTyp_TEMP_STO
7110: 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  RE: {.    if( !z
7120: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
7130: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
7140: 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  , db->temp_store
7150: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7160: 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53 74      changeTempSt
7170: 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a 52  orage(pParse, zR
7180: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
7190: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
71a0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
71b0: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
71c0: 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41 47  tory.  **   PRAG
71d0: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
71e0: 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64 69  rectory = ""|"di
71f0: 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20 20  rectory_name".  
7200: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
7210: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
7220: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d  value of the tem
7230: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
7240: 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  y flag.  Changin
7250: 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  g.  ** the value
7260: 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63   sets a specific
7270: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62 65   directory to be
7280: 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72   used for tempor
7290: 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a 2a 20  ary files..  ** 
72a0: 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c  Setting to a nul
72b0: 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73  l string reverts
72c0: 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20   to the default 
72d0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
72e0: 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20 2a 2a  ory search..  **
72f0: 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20 64 69   If temporary di
7300: 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67  rectory is chang
7310: 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c 69 64  ed, then invalid
7320: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 2e 0a  ateTempStorage..
7330: 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
7340: 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54   PragTyp_TEMP_ST
7350: 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b  ORE_DIRECTORY: {
7360: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
7370: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7380: 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71  SingleText(v, sq
7390: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
73a0: 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tory);.    }else
73b0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
73c0: 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
73d0: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
73e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
73f0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
7400: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64  qlite3OsAccess(d
7410: 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c  b->pVfs, zRight,
7420: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
7430: 45 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b  EADWRITE, &res);
7440: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
7450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65  =SQLITE_OK || re
7460: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
7470: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7480: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61  g(pParse, "not a
7490: 20 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74   writable direct
74a0: 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ory");.         
74b0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
74c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
74d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51    }.      if( SQ
74e0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
74f0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51  =0.       || (SQ
7500: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
7510: 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73  =1 && db->temp_s
7520: 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20 20 20  tore<=1).       
7530: 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  || (SQLITE_TEMP_
7540: 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62 2d 3e  STORE==2 && db->
7550: 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29 0a 20  temp_store==1). 
7560: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7570: 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53 74  invalidateTempSt
7580: 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b 0a 20  orage(pParse);. 
7590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
75a0: 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74 65  ite3_free(sqlite
75b0: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
75c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  );.      if( zRi
75d0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
75e0: 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64    sqlite3_temp_d
75f0: 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69 74  irectory = sqlit
7600: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
7610: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
7620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7630: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
7640: 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  ctory = 0;.     
7650: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
7660: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a  ITE_OMIT_WSD */.
7670: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7680: 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
7690: 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a  _OS_WIN.  /*.  *
76a0: 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f  *   PRAGMA data_
76b0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a  store_directory.
76c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61    **   PRAGMA da
76d0: 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
76e0: 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f  ry = ""|"directo
76f0: 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20  ry_name".  **.  
7700: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
7710: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7720: 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73 74 6f   of the data_sto
7730: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61  re_directory fla
7740: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7750: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7760: 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65   a specific dire
7770: 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64  ctory to be used
7780: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
7790: 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 77 65  les that.  ** we
77a0: 72 65 20 73 70 65 63 69 66 69 65 64 20 77 69 74  re specified wit
77b0: 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
77c0: 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e 67 20  hname.  Setting 
77d0: 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  to a null string
77e0: 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20 74 6f   reverts.  ** to
77f0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 61 74   the default dat
7800: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 2c  abase directory,
7810: 20 77 68 69 63 68 20 66 6f 72 20 64 61 74 61 62   which for datab
7820: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
7830: 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ied with.  ** a 
7840: 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 77 69  relative path wi
7850: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65 20 62  ll probably be b
7860: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
7870: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ent directory fo
7880: 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65  r the.  ** proce
7890: 73 73 2e 20 20 44 61 74 61 62 61 73 65 20 66 69  ss.  Database fi
78a0: 6c 65 20 73 70 65 63 69 66 69 65 64 20 77 69 74  le specified wit
78b0: 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  h an absolute pa
78c0: 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70 61 63  th are not impac
78d0: 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 69 73  ted.  ** by this
78e0: 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61 72 64   setting, regard
78f0: 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61 6c 75  less of its valu
7900: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63  e..  **.  */.  c
7910: 61 73 65 20 50 72 61 67 54 79 70 5f 44 41 54 41  ase PragTyp_DATA
7920: 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59  _STORE_DIRECTORY
7930: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
7940: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
7950: 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c  urnSingleText(v,
7960: 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
7970: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65  rectory);.    }e
7980: 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse{.#ifndef SQL
7990: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
79a0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d     if( zRight[0]
79b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
79c0: 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  res;.        rc 
79d0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
79e0: 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67  s(db->pVfs, zRig
79f0: 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ht, SQLITE_ACCES
7a00: 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72 65  S_READWRITE, &re
7a10: 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
7a20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
7a30: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
7a40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7a50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
7a60: 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69 72  t a writable dir
7a70: 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  ectory");.      
7a80: 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f      goto pragma_
7a90: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
7aa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7ab0: 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74 65  ite3_free(sqlite
7ac0: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7ad0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  );.      if( zRi
7ae0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7af0: 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
7b00: 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69 74  irectory = sqlit
7b10: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
7b20: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
7b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7b40: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
7b50: 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  ctory = 0;.     
7b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
7b70: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a  ITE_OMIT_WSD */.
7b80: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7b90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
7ba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
7bb0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 2f  OCKING_STYLE.  /
7bc0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
7bd0: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72  [schema.]lock_pr
7be0: 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20 20 20  oxy_file.  **   
7bf0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
7c00: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20  lock_proxy_file 
7c10: 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b  = ":auto:"|"lock
7c20: 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20 2a 2a  _file_path".  **
7c30: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
7c40: 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
7c50: 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f   the lock_proxy_
7c60: 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68 61 6e  file flag.  Chan
7c70: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61  ging.  ** the va
7c80: 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69  lue sets a speci
7c90: 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65 20 75  fic file to be u
7ca0: 73 65 64 20 66 6f 72 20 64 61 74 61 62 61 73 65  sed for database
7cb0: 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e 0a 20   access locks.. 
7cc0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
7cd0: 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f  PragTyp_LOCK_PRO
7ce0: 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  XY_FILE: {.    i
7cf0: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
7d00: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
7d10: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
7d20: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
7d30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 72 6f  .      char *pro
7d40: 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d 20 4e  xy_file_path = N
7d50: 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL;.      sqlit
7d60: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
7d70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
7d80: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
7d90: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
7da0: 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c  ntrolHint(pFile,
7db0: 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
7dc0: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f 66 69         &proxy_fi
7df0: 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20 20 20  le_path);.      
7e00: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
7e10: 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65 5f 70  (v, proxy_file_p
7e20: 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
7e30: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
7e40: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
7e50: 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42  reePager(pDb->pB
7e60: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7e70: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  3_file *pFile = 
7e80: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
7e90: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
7ea0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 69  int res;.      i
7eb0: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7ec0: 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c 69          res=sqli
7ed0: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7ee0: 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 53  (pFile, SQLITE_S
7ef0: 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
7f00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 20 20 20 20 20 20 20 7a 52 69 67 68 74 29 3b          zRight);
7f30: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
7f40: 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c 69          res=sqli
7f50: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7f60: 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 53  (pFile, SQLITE_S
7f70: 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
7f80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20          NULL);. 
7fb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7fc0: 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   res!=SQLITE_OK 
7fd0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7fe0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7ff0: 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65  e, "failed to se
8000: 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  t lock proxy fil
8010: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  e");.        got
8020: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
8030: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8040: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
8050: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
8060: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
8070: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 0a 20   */      .    . 
8080: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
8090: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68  A [schema.]synch
80a0: 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52  ronous.  **   PR
80b0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79  AGMA [schema.]sy
80c0: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e  nchronous=OFF|ON
80d0: 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54  |NORMAL|FULL|EXT
80e0: 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  RA.  **.  ** Ret
80f0: 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c  urn or set the l
8100: 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  ocal value of th
8110: 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c  e synchronous fl
8120: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
8130: 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ** the local val
8140: 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ue does not make
8150: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
8160: 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68  disk file and th
8170: 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76  e.  ** default v
8180: 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73  alue will be res
8190: 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20 74  tored the next t
81a0: 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
81b0: 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e   is.  ** opened.
81c0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
81d0: 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  gTyp_SYNCHRONOUS
81e0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
81f0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
8200: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
8210: 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
8220: 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l-1);.    }else{
8230: 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e  .      if( !db->
8240: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
8250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8260: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8270: 20 20 20 20 20 20 20 20 20 20 20 22 53 61 66 65             "Safe
8280: 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e 6f 74  ty level may not
8290: 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e 73 69   be changed insi
82a0: 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  de a transaction
82b0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
82c0: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
82d0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 76 65 6c        int iLevel
82e0: 20 3d 20 28 67 65 74 53 61 66 65 74 79 4c 65 76   = (getSafetyLev
82f0: 65 6c 28 7a 52 69 67 68 74 2c 30 2c 31 29 2b 31  el(zRight,0,1)+1
8300: 29 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  ) & PAGER_SYNCHR
8310: 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 20 20  ONOUS_MASK;.    
8320: 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d      if( iLevel==
8330: 30 20 29 20 69 4c 65 76 65 6c 20 3d 20 31 3b 0a  0 ) iLevel = 1;.
8340: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
8350: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 69 4c 65 76  ety_level = iLev
8360: 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  el;.        pDb-
8370: 3e 62 53 79 6e 63 53 65 74 20 3d 20 31 3b 0a 20  >bSyncSet = 1;. 
8380: 20 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67         setAllPag
8390: 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20  erFlags(db);.   
83a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
83b0: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
83c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
83d0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
83e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
83f0: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
8400: 41 53 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  AS.  case PragTy
8410: 70 5f 46 4c 41 47 3a 20 7b 0a 20 20 20 20 69 66  p_FLAG: {.    if
8420: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
8430: 20 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65       setPragmaRe
8440: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
8450: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 20  v, pPragma);.   
8460: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
8470: 6e 74 28 76 2c 20 28 64 62 2d 3e 66 6c 61 67 73  nt(v, (db->flags
8480: 20 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67   & pPragma->iArg
8490: 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )!=0 );.    }els
84a0: 65 7b 0a 20 20 20 20 20 20 75 36 34 20 6d 61 73  e{.      u64 mas
84b0: 6b 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  k = pPragma->iAr
84c0: 67 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  g;    /* Mask of
84d0: 20 62 69 74 73 20 74 6f 20 73 65 74 20 6f 72 20   bits to set or 
84e0: 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 20 20 20 20  clear. */.      
84f0: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
8500: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
8510: 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79 20   /* Foreign key 
8520: 73 75 70 70 6f 72 74 20 6d 61 79 20 6e 6f 74 20  support may not 
8530: 62 65 20 65 6e 61 62 6c 65 64 20 6f 72 20 64 69  be enabled or di
8540: 73 61 62 6c 65 64 20 77 68 69 6c 65 20 6e 6f 74  sabled while not
8550: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61  .        ** in a
8560: 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
8570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73    */.        mas
8580: 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 46 6f  k &= ~(SQLITE_Fo
8590: 72 65 69 67 6e 4b 65 79 73 29 3b 0a 20 20 20 20  reignKeys);.    
85a0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 55    }.#if SQLITE_U
85b0: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
85c0: 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ON.      if( db-
85d0: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3d  >auth.authLevel=
85e0: 3d 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  =UAUTH_User ){. 
85f0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
8600: 20 61 6c 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e   allow non-admin
8610: 20 75 73 65 72 73 20 74 6f 20 6d 6f 64 69 66 79   users to modify
8620: 20 74 68 65 20 73 63 68 65 6d 61 20 61 72 62 69   the schema arbi
8630: 74 72 61 72 69 6c 79 20 2a 2f 0a 20 20 20 20 20  trarily */.     
8640: 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c     mask &= ~(SQL
8650: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
8660: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
8670: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
8680: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
8690: 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  ight, 0) ){.    
86a0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
86b0: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 65 6c   mask;.      }el
86c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
86d0: 66 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  flags &= ~mask;.
86e0: 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 73 6b          if( mask
86f0: 3d 3d 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  ==SQLITE_DeferFK
8700: 73 20 29 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s ) db->nDeferre
8710: 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
8720: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
8730: 4d 61 6e 79 20 6f 66 20 74 68 65 20 66 6c 61 67  Many of the flag
8740: 2d 70 72 61 67 6d 61 73 20 6d 6f 64 69 66 79 20  -pragmas modify 
8750: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
8760: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 0a 20  ed by the SQL . 
8770: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72       ** compiler
8780: 20 28 65 67 2e 20 63 6f 75 6e 74 5f 63 68 61 6e   (eg. count_chan
8790: 67 65 73 29 2e 20 53 6f 20 61 64 64 20 61 6e 20  ges). So add an 
87a0: 6f 70 63 6f 64 65 20 74 6f 20 65 78 70 69 72 65  opcode to expire
87b0: 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 63 6f   all.      ** co
87c0: 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74 65  mpiled SQL state
87d0: 6d 65 6e 74 73 20 61 66 74 65 72 20 6d 6f 64 69  ments after modi
87e0: 66 79 69 6e 67 20 61 20 70 72 61 67 6d 61 20 76  fying a pragma v
87f0: 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  alue..      */. 
8800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8810: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70  AddOp0(v, OP_Exp
8820: 69 72 65 29 3b 0a 20 20 20 20 20 20 73 65 74 41  ire);.      setA
8830: 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29  llPagerFlags(db)
8840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
8850: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41   SQLITE_OMIT_FLA
8870: 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  G_PRAGMAS */..#i
8880: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8890: 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53  T_SCHEMA_PRAGMAS
88a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
88b0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 3c  GMA table_info(<
88c0: 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a  table>).  **.  *
88d0: 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  * Return a singl
88e0: 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 63  e row for each c
88f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6e 61 6d  olumn of the nam
8900: 65 64 20 74 61 62 6c 65 2e 20 54 68 65 20 63 6f  ed table. The co
8910: 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
8920: 65 20 72 65 74 75 72 6e 65 64 20 64 61 74 61 20  e returned data 
8930: 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20  set are:.  **.  
8940: 2a 2a 20 63 69 64 3a 20 20 20 20 20 20 20 20 43  ** cid:        C
8950: 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d 62 65 72  olumn id (number
8960: 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  ed from left to 
8970: 72 69 67 68 74 2c 20 73 74 61 72 74 69 6e 67 20  right, starting 
8980: 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a  at 0).  ** name:
8990: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61         Column na
89a0: 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a 20 20 20  me.  ** type:   
89b0: 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65 63 6c 61      Column decla
89c0: 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a 20 20 2a  ration type..  *
89d0: 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20 20 54 72  * notnull:    Tr
89e0: 75 65 20 69 66 20 27 4e 4f 54 20 4e 55 4c 4c 27  ue if 'NOT NULL'
89f0: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6c 75   is part of colu
8a00: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 20  mn declaration. 
8a10: 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75 65 3a 20   ** dflt_value: 
8a20: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
8a30: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
8a40: 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a 2a 20 70  , if any..  ** p
8a50: 6b 3a 20 20 20 20 20 20 20 20 20 4e 6f 6e 2d 7a  k:         Non-z
8a60: 65 72 6f 20 66 6f 72 20 50 4b 20 66 69 65 6c 64  ero for PK field
8a70: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  s..  */.  case P
8a80: 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46  ragTyp_TABLE_INF
8a90: 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  O: if( zRight ){
8aa0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8ab0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
8ac0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
8ad0: 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e  pParse, LOCATE_N
8ae0: 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44  OERR, zRight, zD
8af0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
8b00: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
8b10: 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63  abDb = sqlite3Sc
8b20: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
8b30: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
8b40: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 0a        int i, k;.
8b50: 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64 65        int nHidde
8b60: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f 6c  n = 0;.      Col
8b70: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  umn *pCol;.     
8b80: 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
8b90: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
8ba0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
8bb0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8bc0: 20 37 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   7;.      sqlite
8bd0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8be0: 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44 62  a(pParse, iTabDb
8bf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8c00: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
8c10: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
8c20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
8c30: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
8c40: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
8c50: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
8c60: 20 20 20 20 20 20 69 6e 74 20 69 73 48 69 64 64        int isHidd
8c70: 65 6e 20 3d 20 49 73 48 69 64 64 65 6e 43 6f 6c  en = IsHiddenCol
8c80: 75 6d 6e 28 70 43 6f 6c 29 3b 0a 20 20 20 20 20  umn(pCol);.     
8c90: 20 20 20 69 66 28 20 69 73 48 69 64 64 65 6e 20     if( isHidden 
8ca0: 26 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67  && pPragma->iArg
8cb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8cc0: 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20   nHidden++;.    
8cd0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8ce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8cf0: 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c    if( (pCol->col
8d00: 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
8d10: 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20  PRIMKEY)==0 ){. 
8d20: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a           k = 0;.
8d30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8d40: 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPk==0 ){.    
8d50: 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20        k = 1;.   
8d60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8d70: 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
8d80: 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20  <=pTab->nCol && 
8d90: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d  pPk->aiColumn[k-
8da0: 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20  1]!=i; k++){}.  
8db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8dc0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44  assert( pCol->pD
8dd0: 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e  flt==0 || pCol->
8de0: 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50  pDflt->op==TK_SP
8df0: 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  AN );.        sq
8e00: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8e10: 61 64 28 76 2c 20 31 2c 20 70 50 72 61 67 6d 61  ad(v, 1, pPragma
8e20: 2d 3e 69 41 72 67 20 3f 20 22 69 73 73 69 73 69  ->iArg ? "issisi
8e30: 69 22 20 3a 20 22 69 73 73 69 73 69 22 2c 0a 20  i" : "issisi",. 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2d                i-
8e50: 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20  nHidden,.       
8e60: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
8e70: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8e80: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
8e90: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a  nType(pCol,""),.
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
8eb0: 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31  Col->notNull ? 1
8ec0: 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20   : 0,.          
8ed0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
8ee0: 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e   ? pCol->pDflt->
8ef0: 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20  u.zToken : 0,.  
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 2c 0a               k,.
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8f20: 73 48 69 64 64 65 6e 29 3b 0a 20 20 20 20 20 20  sHidden);.      
8f30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
8f40: 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  eak;..#ifdef SQL
8f50: 49 54 45 5f 44 45 42 55 47 0a 20 20 63 61 73 65  ITE_DEBUG.  case
8f60: 20 50 72 61 67 54 79 70 5f 53 54 41 54 53 3a 20   PragTyp_STATS: 
8f70: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
8f80: 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  x;.    HashElem 
8f90: 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  *i;.    pParse->
8fa0: 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 73 71  nMem = 5;.    sq
8fb0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
8fc0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
8fd0: 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 71  b);.    for(i=sq
8fe0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
8ff0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
9000: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
9010: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9020: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
9030: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
9040: 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(i);.      sql
9050: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9060: 64 28 76 2c 20 31 2c 20 22 73 73 69 69 69 22 2c  d(v, 1, "ssiii",
9070: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
9080: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
9090: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
90a0: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
90b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
90c0: 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c 0a 20  b->nRowLogEst,. 
90d0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
90e0: 74 61 62 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  tabFlags);.     
90f0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9100: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9110: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9120: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9130: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9140: 20 32 2c 20 22 73 69 69 69 58 22 2c 0a 20 20 20   2, "siiiX",.   
9150: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e          pIdx->zN
9160: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
9170: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 2c 0a  pIdx->szIdxRow,.
9180: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9190: 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 2c  >aiRowLogEst[0],
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
91b0: 2d 3e 68 61 73 53 74 61 74 31 29 3b 0a 20 20 20  ->hasStat1);.   
91c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
91d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
91e0: 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29 3b 0a 20  ultRow, 1, 5);. 
91f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9200: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
9210: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9220: 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69 66 28  _INDEX_INFO: if(
9230: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49   zRight ){.    I
9240: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
9250: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
9260: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46   pIdx = sqlite3F
9270: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69  indIndex(db, zRi
9280: 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ght, zDb);.    i
9290: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
92a0: 20 69 6e 74 20 69 49 64 78 44 62 20 3d 20 73 71   int iIdxDb = sq
92b0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
92c0: 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63  ex(db, pIdx->pSc
92d0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69 6e 74  hema);.      int
92e0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   i;.      int mx
92f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61  ;.      if( pPra
9300: 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20  gma->iArg ){.   
9310: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
9320: 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65  ndex_xinfo (newe
9330: 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d  r version with m
9340: 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c  ore rows and col
9350: 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20  umns) */.       
9360: 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c   mx = pIdx->nCol
9370: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61  umn;.        pPa
9380: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20  rse->nMem = 6;. 
9390: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
93a0: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
93b0: 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79  dex_info (legacy
93c0: 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20   version) */.   
93d0: 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e       mx = pIdx->
93e0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
93f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9400: 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  3;.      }.     
9410: 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54   pTab = pIdx->pT
9420: 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  able;.      sqli
9430: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
9440: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 49 64 78  ema(pParse, iIdx
9450: 44 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Db);.      asser
9460: 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c  t( pParse->nMem<
9470: 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43  =pPragma->nPragC
9480: 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 66 6f  Name );.      fo
9490: 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b  r(i=0; i<mx; i++
94a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 63  ){.        i16 c
94b0: 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  num = pIdx->aiCo
94c0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
94d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
94e0: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73  iLoad(v, 1, "iis
94f0: 58 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a 20 20 20  X", i, cnum,.   
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9510: 20 20 20 20 20 20 20 20 20 20 63 6e 75 6d 3c 30            cnum<0
9520: 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 61 43 6f   ? 0 : pTab->aCo
9530: 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[cnum].zName);.
9540: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 61          if( pPra
9550: 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20  gma->iArg ){.   
9560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9570: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 34  beMultiLoad(v, 4
9580: 2c 20 22 69 73 69 58 22 2c 0a 20 20 20 20 20 20  , "isiX",.      
9590: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 6f 72        pIdx->aSor
95a0: 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20 20 20 20  tOrder[i],.     
95b0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
95c0: 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  oll[i],.        
95d0: 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79      i<pIdx->nKey
95e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Col);.        }.
95f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9600: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9610: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 70 50  ResultRow, 1, pP
9620: 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  arse->nMem);.   
9630: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9640: 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20   break;..  case 
9650: 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 4c 49  PragTyp_INDEX_LI
9660: 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  ST: if( zRight )
9670: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
9680: 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
9690: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ab;.    int i;. 
96a0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
96b0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
96c0: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
96d0: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
96e0: 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20     int iTabDb = 
96f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
9700: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
9710: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 70  Schema);.      p
9720: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b  Parse->nMem = 5;
9730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
9740: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
9750: 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a  Parse, iTabDb);.
9760: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
9770: 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d 30  Tab->pIndex, i=0
9780: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9790: 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a  x->pNext, i++){.
97a0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
97b0: 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20 3d  ar *azOrigin[] =
97c0: 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22 70 6b   { "c", "u", "pk
97d0: 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  " };.        sql
97e0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
97f0: 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69 22 2c  d(v, 1, "isisi",
9800: 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20  .           i,. 
9810: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9820: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
9830: 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28    IsUniqueIndex(
9840: 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20  pIdx),.         
9850: 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78 2d    azOrigin[pIdx-
9860: 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20 20 20  >idxType],.     
9870: 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50 61 72        pIdx->pPar
9880: 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b 0a 20  tIdxWhere!=0);. 
9890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
98a0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73  .  break;..  cas
98b0: 65 20 50 72 61 67 54 79 70 5f 44 41 54 41 42 41  e PragTyp_DATABA
98c0: 53 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69  SE_LIST: {.    i
98d0: 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65  nt i;.    pParse
98e0: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
98f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
9900: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
9910: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
9920: 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Bt==0 ) continue
9930: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9940: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
9950: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ame!=0 );.      
9960: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9970: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 73 22  Load(v, 1, "iss"
9980: 2c 0a 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20  ,.         i,.  
9990: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
99a0: 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20  ].zDbSName,.    
99b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
99c0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
99d0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20  >aDb[i].pBt));. 
99e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
99f0: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9a00: 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54  p_COLLATION_LIST
9a10: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  : {.    int i = 
9a20: 30 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  0;.    HashElem 
9a30: 2a 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  *p;.    pParse->
9a40: 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f  nMem = 2;.    fo
9a50: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
9a60: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
9a70: 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  q); p; p=sqliteH
9a80: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
9a90: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9aa0: 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73  l = (CollSeq *)s
9ab0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
9ac0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9ad0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
9ae0: 31 2c 20 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43  1, "is", i++, pC
9af0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
9b00: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9b10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
9b20: 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41  NTROSPECTION_PRA
9b30: 47 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61 67  GMAS.  case Prag
9b40: 54 79 70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  Typ_FUNCTION_LIS
9b50: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  T: {.    int i;.
9b60: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b      HashElem *j;
9b70: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  .    FuncDef *p;
9b80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9b90: 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69  m = 2;.    for(i
9ba0: 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55 4e  =0; i<SQLITE_FUN
9bb0: 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b  C_HASH_SZ; i++){
9bc0: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
9bd0: 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74  ite3BuiltinFunct
9be0: 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d  ions.a[i]; p; p=
9bf0: 70 2d 3e 75 2e 70 48 61 73 68 20 29 7b 0a 20 20  p->u.pHash ){.  
9c00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 75 6e        if( p->fun
9c10: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
9c20: 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 20 29 20  FUNC_INTERNAL ) 
9c30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9c50: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 69  tiLoad(v, 1, "si
9c60: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b  ", p->zName, 1);
9c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c80: 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48     for(j=sqliteH
9c90: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46  ashFirst(&db->aF
9ca0: 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69 74  unc); j; j=sqlit
9cb0: 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a 20  eHashNext(j)){. 
9cc0: 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63 44 65       p = (FuncDe
9cd0: 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  f*)sqliteHashDat
9ce0: 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(j);.      sqli
9cf0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9d00: 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e  (v, 1, "si", p->
9d10: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
9d20: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
9d30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9d40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9d50: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d    case PragTyp_M
9d60: 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20 20  ODULE_LIST: {.  
9d70: 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20    HashElem *j;. 
9d80: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9d90: 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 73  = 1;.    for(j=s
9da0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9db0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a 3b  db->aModule); j;
9dc0: 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   j=sqliteHashNex
9dd0: 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f 64  t(j)){.      Mod
9de0: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
9df0: 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ule*)sqliteHashD
9e00: 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71  ata(j);.      sq
9e10: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9e20: 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 70 4d  ad(v, 1, "s", pM
9e30: 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  od->zName);.    
9e40: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
9e50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9e60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9e70: 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72 61  E */..  case Pra
9e80: 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53 54  gTyp_PRAGMA_LIST
9e90: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  : {.    int i;. 
9ea0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
9eb0: 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d 61 4e  raySize(aPragmaN
9ec0: 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ame); i++){.    
9ed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9ee0: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22  tiLoad(v, 1, "s"
9ef0: 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69 5d  , aPragmaName[i]
9f00: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
9f10: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
9f20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54  if /* SQLITE_INT
9f30: 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d  ROSPECTION_PRAGM
9f40: 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  AS */..#endif /*
9f50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
9f60: 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  EMA_PRAGMAS */..
9f70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f80: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
9f90: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
9fa0: 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a  OREIGN_KEY_LIST:
9fb0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
9fc0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20     FKey *pFK;.  
9fd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9fe0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
9ff0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
a000: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
a010: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
a020: 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70     pFK = pTab->p
a030: 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20  FKey;.      if( 
a040: 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pFK ){.        i
a050: 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69  nt iTabDb = sqli
a060: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
a070: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
a080: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ma);.        int
a090: 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20   i = 0; .       
a0a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
a0b0: 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  8;.        sqlit
a0c0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
a0d0: 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ma(pParse, iTabD
a0e0: 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  b);.        whil
a0f0: 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20 20  e(pFK){.        
a100: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
a110: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46     for(j=0; j<pF
a120: 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  K->nCol; j++){. 
a130: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a140: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
a150: 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73 22  v, 1, "iissssss"
a160: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a170: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20       i,.        
a180: 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20 20             j,.  
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20   pFK->zTo,.     
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
a1c0: 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43  ab->aCol[pFK->aC
a1d0: 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61  ol[j].iFrom].zNa
a1e0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
a1f0: 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c         pFK->aCol
a200: 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20  [j].zCol,.      
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74               act
a220: 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63  ionName(pFK->aAc
a230: 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e  tion[1]),  /* ON
a240: 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 20   UPDATE */.     
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a260: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a270: 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f  ction[0]),  /* O
a280: 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20  N DELETE */.    
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
a2a0: 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20 20  NONE");.        
a2b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b 2b    }.          ++
a2c0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  i;.          pFK
a2d0: 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f   = pFK->pNextFro
a2e0: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
a2f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a300: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
a310: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
a320: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
a330: 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EY) */..#ifndef 
a340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
a350: 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20  IGN_KEY.#ifndef 
a360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
a370: 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67 54  GER.  case PragT
a380: 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 43  yp_FOREIGN_KEY_C
a390: 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65 79  HECK: {.    FKey
a3a0: 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20 20   *pFK;          
a3b0: 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e 20     /* A foreign 
a3c0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  key constraint *
a3d0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
a3e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
a3f0: 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e 74  Child table cont
a400: 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53 22  ain "REFERENCES"
a410: 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20   keyword */.    
a420: 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b 20  Table *pParent; 
a430: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
a440: 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69 6c   table that chil
a450: 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20  d points to */. 
a460: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
a470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
a480: 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ex in the parent
a490: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
a4a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
a4b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a4c0: 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20 6b  nter:  Foreign k
a4d0: 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54  ey number for pT
a4e0: 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b  ab */.    int j;
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a510: 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65 20  :  Field of the 
a520: 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a 20  foreign key */. 
a530: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20     HashElem *k; 
a540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a550: 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78 74  p counter:  Next
a560: 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d 61   table in schema
a570: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20 20   */.    int x;  
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a590: 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62 6c  * result variabl
a5a0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  e */.    int reg
a5b0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
a5c0: 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20 74  /* 3 registers t
a5d0: 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74 20  o hold a result 
a5e0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  row */.    int r
a5f0: 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  egKey;          
a600: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
a610: 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63 68   hold key for ch
a620: 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a 2f  ecking the FK */
a630: 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  .    int regRow;
a640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a650: 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
a660: 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61 62   a row from pTab
a670: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
a680: 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Top;           /
a690: 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70 20  * Top of a loop 
a6a0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67 6e  checking foreign
a6b0: 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e 74   keys */.    int
a6c0: 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20 20   addrOk;        
a6d0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
a6e0: 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20 4f   if the key is O
a6f0: 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69  K */.    int *ai
a700: 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
a710: 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72 65  /* child to pare
a720: 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e  nt column mappin
a730: 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65 73  g */..    regRes
a740: 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ult = pParse->nM
a750: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
a760: 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20 20  ->nMem += 4;.   
a770: 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61 72   regKey = ++pPar
a780: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
a790: 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gRow = ++pParse-
a7a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 6b 20 3d 20 73  >nMem;.    k = s
a7b0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
a7c0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a7d0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 0a  hema->tblHash);.
a7e0: 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b 0a      while( k ){.
a7f0: 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44 62        int iTabDb
a800: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
a810: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ht ){.        pT
a820: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
a830: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
a840: 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  0, zRight, zDb);
a850: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  .        k = 0;.
a860: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a870: 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
a880: 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
a890: 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b  ta(k);.        k
a8a0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78   = sqliteHashNex
a8b0: 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(k);.      }.  
a8c0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
a8d0: 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d  || pTab->pFKey==
a8e0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
a8f0: 20 20 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c      iTabDb = sql
a900: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
a910: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
a920: 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
a930: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a940: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62  ema(pParse, iTab
a950: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
a960: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
a970: 73 65 2c 20 69 54 61 62 44 62 2c 20 70 54 61 62  se, iTabDb, pTab
a980: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
a990: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
a9a0: 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65  f( pTab->nCol+re
a9b0: 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d 65  gRow>pParse->nMe
a9c0: 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m ) pParse->nMem
a9d0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20   = pTab->nCol + 
a9e0: 72 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  regRow;.      sq
a9f0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
aa00: 50 61 72 73 65 2c 20 30 2c 20 69 54 61 62 44 62  Parse, 0, iTabDb
aa10: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
aa20: 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ead);.      sqli
aa30: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
aa40: 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  g(v, regResult, 
aa50: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
aa60: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
aa70: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
aa80: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
aa90: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
aaa0: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
aab0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
aac0: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
aad0: 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
aae0: 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f 6e  pParent==0 ) con
aaf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
ab00: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
ab10: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
ab20: 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62 44 62  k(pParse, iTabDb
ab30: 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c  , pParent->tnum,
ab40: 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61   0, pParent->zNa
ab50: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  me);.        x =
ab60: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
ab70: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
ab80: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
ab90: 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  x, 0);.        i
aba0: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
abb0: 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30       if( pIdx==0
abc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
abd0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
abe0: 28 70 50 61 72 73 65 2c 20 69 2c 20 69 54 61 62  (pParse, i, iTab
abf0: 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f  Db, pParent, OP_
ac00: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
ac10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ac20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ac30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ac40: 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64  OpenRead, i, pId
ac50: 78 2d 3e 74 6e 75 6d 2c 20 69 54 61 62 44 62 29  x->tnum, iTabDb)
ac60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
ac70: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
ac80: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
ac90: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dx);.          }
aca0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
acb0: 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b            k = 0;
acc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
acd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ace0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
acf0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
ad00: 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20   || pFK==0 );.  
ad10: 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62 72      if( pFK ) br
ad20: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
ad30: 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20  Parse->nTab<i ) 
ad40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69  pParse->nTab = i
ad50: 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
ad60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ad70: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
ad80: 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
ad90: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  ge(v);.      for
ada0: 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e  (i=1, pFK=pTab->
adb0: 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c  pFKey; pFK; i++,
adc0: 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46   pFK=pFK->pNextF
add0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50  rom){.        pP
ade0: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  arent = sqlite3F
adf0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b  indTable(db, pFK
ae00: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
ae10: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
ae20: 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d 20         aiCols = 
ae30: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
ae40: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
ae50: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46      x = sqlite3F
ae60: 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61  kLocateIndex(pPa
ae70: 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46  rse, pParent, pF
ae80: 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c  K, &pIdx, &aiCol
ae90: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  s);.          as
aea0: 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20  sert( x==0 );.  
aeb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aec0: 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33  addrOk = sqlite3
aed0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
aee0: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  arse);..        
aef0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
af00: 20 74 6f 20 72 65 61 64 20 74 68 65 20 63 68 69   to read the chi
af10: 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20 69 6e  ld key values in
af20: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  to registers.   
af30: 20 20 20 20 20 2a 2a 20 72 65 67 52 6f 77 2e 2e       ** regRow..
af40: 72 65 67 52 6f 77 2b 6e 2e 20 49 66 20 61 6e 79  regRow+n. If any
af50: 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65   of the child ke
af60: 79 20 76 61 6c 75 65 73 20 61 72 65 20 4e 55 4c  y values are NUL
af70: 4c 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  L, this .       
af80: 20 2a 2a 20 72 6f 77 20 63 61 6e 6e 6f 74 20 63   ** row cannot c
af90: 61 75 73 65 20 61 6e 20 46 4b 20 76 69 6f 6c 61  ause an FK viola
afa0: 74 69 6f 6e 2e 20 4a 75 6d 70 20 64 69 72 65 63  tion. Jump direc
afb0: 74 6c 79 20 74 6f 20 61 64 64 72 4f 6b 20 69 6e  tly to addrOk in
afc0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
afd0: 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20  s case. */.     
afe0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46     for(j=0; j<pF
aff0: 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  K->nCol; j++){. 
b000: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f           int iCo
b010: 6c 20 3d 20 61 69 43 6f 6c 73 20 3f 20 61 69 43  l = aiCols ? aiC
b020: 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43  ols[j] : pFK->aC
b030: 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20  ol[j].iFrom;.   
b040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b050: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
b060: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
b070: 30 2c 20 69 43 6f 6c 2c 20 72 65 67 52 6f 77 2b  0, iCol, regRow+
b080: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  j);.          sq
b090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b0a0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
b0b0: 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b  gRow+j, addrOk);
b0c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b0d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
b0e0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
b0f0: 20 63 6f 64 65 20 74 6f 20 71 75 65 72 79 20 74   code to query t
b100: 68 65 20 70 61 72 65 6e 74 20 69 6e 64 65 78 20  he parent index 
b110: 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 70  for a matching p
b120: 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  arent.        **
b130: 20 6b 65 79 2e 20 49 66 20 61 20 6d 61 74 63 68   key. If a match
b140: 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70 20   is found, jump 
b150: 74 6f 20 61 64 64 72 4f 6b 2e 20 2a 2f 0a 20 20  to addrOk. */.  
b160: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29        if( pIdx )
b170: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b180: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
b190: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
b1a0: 72 65 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43 6f  regRow, pFK->nCo
b1b0: 6c 2c 20 72 65 67 4b 65 79 2c 0a 20 20 20 20 20  l, regKey,.     
b1c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b1d0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
b1e0: 28 64 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d 3e  (db,pIdx), pFK->
b1f0: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  nCol);.         
b200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b210: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
b220: 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72 65  d, i, addrOk, re
b230: 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  gKey, 0);.      
b240: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b250: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  (v);.        }el
b260: 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  se if( pParent )
b270: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
b280: 6a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  jmp = sqlite3Vdb
b290: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
b2a0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  2;.          sql
b2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b2c0: 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
b2d0: 69 2c 20 6a 6d 70 2c 20 72 65 67 52 6f 77 29 3b  i, jmp, regRow);
b2e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b2f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b300: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
b310: 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  ddrOk);.        
b320: 20 20 61 73 73 65 72 74 28 20 70 46 4b 2d 3e 6e    assert( pFK->n
b330: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
b340: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
b350: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
b360: 20 72 65 70 6f 72 74 20 61 6e 20 46 4b 20 76 69   report an FK vi
b370: 6f 6c 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  olation to the c
b380: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  aller. */.      
b390: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
b3a0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b3c0: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
b3d0: 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29   0, regResult+1)
b3e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b3f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b400: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b410: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
b420: 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20  esult+1);.      
b430: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
b440: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
b450: 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2b 32 2c  (v, regResult+2,
b460: 20 22 73 69 58 22 2c 20 70 46 4b 2d 3e 7a 54 6f   "siX", pFK->zTo
b470: 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , i-1);.        
b480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b490: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
b4a0: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 34 29  w, regResult, 4)
b4b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b4c0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
b4d0: 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20  l(v, addrOk);.  
b4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
b4f0: 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73 29 3b  ree(db, aiCols);
b500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b520: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20  (v, OP_Next, 0, 
b530: 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65  addrTop+1); Vdbe
b540: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b560: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
b570: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
b580: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
b590: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b5a0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
b5b0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  /.#endif /* !def
b5c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b5d0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
b5e0: 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c  ..  /* Reinstall
b5f0: 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c   the LIKE and GL
b600: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
b610: 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20 4c 49  he variant of LI
b620: 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77 69 6c  KE.  ** used wil
b630: 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73 69 74  l be case sensit
b640: 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ive or not depen
b650: 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48 53 2e  ding on the RHS.
b660: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
b670: 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53 49 54  gTyp_CASE_SENSIT
b680: 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20  IVE_LIKE: {.    
b690: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b6a0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
b6b0: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
b6c0: 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65 74 42  (db, sqlite3GetB
b6d0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
b6e0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
b6f0: 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20  break;..#ifndef 
b700: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b710: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b720: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
b730: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b740: 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30 30 0a 23  _ERROR_MAX 100.#
b750: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
b760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
b770: 52 49 54 59 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  RITY_CHECK.  /* 
b780: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
b790: 69 74 79 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20  ity_check.  **  
b7a0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
b7b0: 74 79 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ty_check(N).  **
b7c0: 20 20 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b      PRAGMA quick
b7d0: 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50  _check.  **    P
b7e0: 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63  RAGMA quick_chec
b7f0: 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  k(N).  **.  ** V
b800: 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72  erify the integr
b810: 69 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ity of the datab
b820: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
b830: 68 65 20 22 71 75 69 63 6b 5f 63 68 65 63 6b 22  he "quick_check"
b840: 20 69 73 20 72 65 64 75 63 65 64 20 76 65 72 73   is reduced vers
b850: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69 6e 74  ion of .  ** int
b860: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64 65 73  egrity_check des
b870: 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63 74 20  igned to detect 
b880: 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  most database co
b890: 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20 77 69  rruption.  ** wi
b8a0: 74 68 6f 75 74 20 74 68 65 20 6f 76 65 72 68 65  thout the overhe
b8b0: 61 64 20 6f 66 20 63 72 6f 73 73 2d 63 68 65 63  ad of cross-chec
b8c0: 6b 69 6e 67 20 69 6e 64 65 78 65 73 2e 20 20 51  king indexes.  Q
b8d0: 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20  uick_check.  ** 
b8e0: 69 73 20 6c 69 6e 65 61 72 20 74 69 6d 65 20 77  is linear time w
b8f0: 68 65 72 65 61 73 65 20 69 6e 74 65 67 72 69 74  herease integrit
b900: 79 5f 63 68 65 63 6b 20 69 73 20 4f 28 4e 6c 6f  y_check is O(Nlo
b910: 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  gN)..  */.  case
b920: 20 50 72 61 67 54 79 70 5f 49 4e 54 45 47 52 49   PragTyp_INTEGRI
b930: 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20  TY_CHECK: {.    
b940: 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20  int i, j, addr, 
b950: 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69 6e 74 20  mxErr;..    int 
b960: 69 73 51 75 69 63 6b 20 3d 20 28 73 71 6c 69 74  isQuick = (sqlit
b970: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
b980: 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20 20  0])=='q');..    
b990: 2f 2a 20 49 66 20 74 68 65 20 50 52 41 47 4d 41  /* If the PRAGMA
b9a0: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66 20   command was of 
b9b0: 74 68 65 20 66 6f 72 6d 20 22 50 52 41 47 4d 41  the form "PRAGMA
b9c0: 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74 79 5f   <db>.integrity_
b9d0: 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20 74  check",.    ** t
b9e0: 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74  hen iDb is set t
b9f0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
ba00: 68 65 20 64 61 74 61 62 61 73 65 20 69 64 65 6e  he database iden
ba10: 74 69 66 69 65 64 20 62 79 20 3c 64 62 3e 2e 0a  tified by <db>..
ba20: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
ba30: 61 73 65 2c 20 74 68 65 20 69 6e 74 65 67 72 69  ase, the integri
ba40: 74 79 20 6f 66 20 64 61 74 61 62 61 73 65 20 69  ty of database i
ba50: 44 62 20 6f 6e 6c 79 20 69 73 20 76 65 72 69 66  Db only is verif
ba60: 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ied by.    ** th
ba70: 65 20 56 44 42 45 20 63 72 65 61 74 65 64 20 62  e VDBE created b
ba80: 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  elow..    **.   
ba90: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
baa0: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77 61  f the command wa
bab0: 73 20 73 69 6d 70 6c 79 20 22 50 52 41 47 4d 41  s simply "PRAGMA
bac0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bad0: 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50 52  " (or.    ** "PR
bae0: 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b  AGMA quick_check
baf0: 22 29 2c 20 74 68 65 6e 20 69 44 62 20 69 73 20  "), then iDb is 
bb00: 73 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68 69  set to 0. In thi
bb10: 73 20 63 61 73 65 2c 20 73 65 74 20 69 44 62 0a  s case, set iDb.
bb20: 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65 72      ** to -1 her
bb30: 65 2c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  e, to indicate t
bb40: 68 61 74 20 74 68 65 20 56 44 42 45 20 73 68 6f  hat the VDBE sho
bb50: 75 6c 64 20 76 65 72 69 66 79 20 74 68 65 20 69  uld verify the i
bb60: 6e 74 65 67 72 69 74 79 0a 20 20 20 20 2a 2a 20  ntegrity.    ** 
bb70: 6f 66 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  of all attached 
bb80: 64 61 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a 20  databases.  */. 
bb90: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
bba0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
bbb0: 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32 2d   iDb==0 || pId2-
bbc0: 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  >z );.    if( pI
bbd0: 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20 3d  d2->z==0 ) iDb =
bbe0: 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69   -1;..    /* Ini
bbf0: 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44 42 45  tialize the VDBE
bc00: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20   program */.    
bc10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36  pParse->nMem = 6
bc20: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
bc30: 65 20 6d 61 78 69 6d 75 6d 20 65 72 72 6f 72 20  e maximum error 
bc40: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 6d 78 45  count */.    mxE
bc50: 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rr = SQLITE_INTE
bc60: 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f  GRITY_CHECK_ERRO
bc70: 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66 28 20 7a  R_MAX;.    if( z
bc80: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
bc90: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
bca0: 52 69 67 68 74 2c 20 26 6d 78 45 72 72 29 3b 0a  Right, &mxErr);.
bcb0: 20 20 20 20 20 20 69 66 28 20 6d 78 45 72 72 3c        if( mxErr<
bcc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78  =0 ){.        mx
bcd0: 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Err = SQLITE_INT
bce0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
bcf0: 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20 20 7d 0a  OR_MAX;.      }.
bd00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bd10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bd20: 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78 45 72 72  P_Integer, mxErr
bd30: 2d 31 2c 20 31 29 3b 20 2f 2a 20 72 65 67 5b 31  -1, 1); /* reg[1
bd40: 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73 20 6c  ] holds errors l
bd50: 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44  eft */..    /* D
bd60: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
bd70: 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64 61 74  heck on each dat
bd80: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
bd90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
bda0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
bdb0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b 20 20    HashElem *x;  
bdc0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
bdd0: 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
bde0: 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
bdf0: 20 20 20 20 20 48 61 73 68 20 2a 70 54 62 6c 73       Hash *pTbls
be00: 3b 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20  ;     /* Set of 
be10: 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
be20: 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  e schema */.    
be30: 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20    int *aRoot;   
be40: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
be50: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73  oot page numbers
be60: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 2a   of all btrees *
be70: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  /.      int cnt 
be80: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
be90: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
bea0: 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 20 20   aRoot[] */.    
beb0: 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20 30 3b    int mxIdx = 0;
bec0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
bed0: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 20  mber of indexes 
bee0: 66 6f 72 20 61 6e 79 20 74 61 62 6c 65 20 2a 2f  for any table */
bef0: 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49 54  ..      if( OMIT
bf00: 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31 20  _TEMPDB && i==1 
bf10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bf20: 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26 20    if( iDb>=0 && 
bf30: 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e 75  i!=iDb ) continu
bf40: 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e;..      sqlite
bf50: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
bf60: 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 0a 20  a(pParse, i);.. 
bf70: 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e       /* Do an in
bf80: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 66  tegrity check of
bf90: 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20 20 20   the B-Tree.    
bfa0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65    **.      ** Be
bfb0: 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67 20 74  gin by finding t
bfc0: 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  he root pages nu
bfd0: 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66  mbers.      ** f
bfe0: 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  or all tables an
bff0: 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65  d indices in the
c000: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
c010: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
c020: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
c030: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20  utexHeld(db, i, 
c040: 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c  0) );.      pTbl
c050: 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  s = &db->aDb[i].
c060: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
c070: 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d  ;.      for(cnt=
c080: 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46  0, x=sqliteHashF
c090: 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20  irst(pTbls); x; 
c0a0: 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  x=sqliteHashNext
c0b0: 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (x)){.        Ta
c0c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
c0d0: 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 20 20  teHashData(x);  
c0e0: 2f 2a 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  /* Current table
c0f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
c100: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c120: 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   An index on pTa
c130: 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  b */.        int
c140: 20 6e 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   nIdx;          
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
c170: 78 65 73 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20  xes on pTab */. 
c180: 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
c190: 77 69 64 28 70 54 61 62 29 20 29 20 63 6e 74 2b  wid(pTab) ) cnt+
c1a0: 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e  +;.        for(n
c1b0: 49 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  Idx=0, pIdx=pTab
c1c0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
c1d0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
c1e0: 2c 20 6e 49 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b  , nIdx++){ cnt++
c1f0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
c200: 6e 49 64 78 3e 6d 78 49 64 78 20 29 20 6d 78 49  nIdx>mxIdx ) mxI
c210: 64 78 20 3d 20 6e 49 64 78 3b 0a 20 20 20 20 20  dx = nIdx;.     
c220: 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74 20 3d   }.      aRoot =
c230: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c240: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
c250: 28 69 6e 74 29 2a 28 63 6e 74 2b 31 29 29 3b 0a  (int)*(cnt+1));.
c260: 20 20 20 20 20 20 69 66 28 20 61 52 6f 6f 74 3d        if( aRoot=
c270: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c280: 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73    for(cnt=0, x=s
c290: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
c2a0: 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Tbls); x; x=sqli
c2b0: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
c2c0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
c2d0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
c2e0: 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20  Data(x);.       
c2f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
c300: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
c310: 69 64 28 70 54 61 62 29 20 29 20 61 52 6f 6f 74  id(pTab) ) aRoot
c320: 5b 2b 2b 63 6e 74 5d 20 3d 20 70 54 61 62 2d 3e  [++cnt] = pTab->
c330: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 66 6f  tnum;.        fo
c340: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
c350: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c360: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
c370: 20 20 20 20 20 20 20 20 61 52 6f 6f 74 5b 2b 2b          aRoot[++
c380: 63 6e 74 5d 20 3d 20 70 49 64 78 2d 3e 74 6e 75  cnt] = pIdx->tnu
c390: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
c3a0: 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74     }.      aRoot
c3b0: 5b 30 5d 20 3d 20 63 6e 74 3b 0a 0a 20 20 20 20  [0] = cnt;..    
c3c0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 73    /* Make sure s
c3d0: 75 66 66 69 63 69 65 6e 74 20 6e 75 6d 62 65 72  ufficient number
c3e0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 61   of registers ha
c3f0: 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
c400: 64 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73  d */.      pPars
c410: 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 20 70  e->nMem = MAX( p
c420: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d  Parse->nMem, 8+m
c430: 78 49 64 78 20 29 3b 0a 20 20 20 20 20 20 73 71  xIdx );.      sq
c440: 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
c450: 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
c460: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  .      /* Do the
c470: 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74   b-tree integrit
c480: 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20  y checks */.    
c490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c4a0: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72  Op4(v, OP_Integr
c4b0: 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31  ityCk, 2, cnt, 1
c4c0: 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50  , (char*)aRoot,P
c4d0: 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20  4_INTARRAY);.   
c4e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c4f0: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69 29  angeP5(v, (u8)i)
c500: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
c510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c520: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32  (v, OP_IsNull, 2
c530: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
c540: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
c550: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c560: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
c570: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
c580: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c590: 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  "*** in database
c5a0: 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e   %s ***\n", db->
c5b0: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[i].zDbSName)
c5c0: 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44 59  ,.         P4_DY
c5d0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
c5e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c5f0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c  v, OP_Concat, 2,
c600: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 6e   3, 3);.      in
c610: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
c620: 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20  ltRow(v);.      
c630: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c640: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20  ere(v, addr);.. 
c650: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
c660: 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65  e all the indice
c670: 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65  s are constructe
c680: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  d correctly..   
c690: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
c6a0: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
c6b0: 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73  t(pTbls); x; x=s
c6c0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29  qliteHashNext(x)
c6d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
c6e0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c6f0: 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20  ashData(x);.    
c700: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c      Index *pIdx,
c710: 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20 49   *pPk;.        I
c720: 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30  ndex *pPrior = 0
c730: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f  ;.        int lo
c740: 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  opTop;.        i
c750: 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  nt iDataCur, iId
c760: 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  xCur;.        in
c770: 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20  t r1 = -1;..    
c780: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
c790: 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  um<1 ) continue;
c7a0: 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57 73 20    /* Skip VIEWs 
c7b0: 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  or VIRTUAL TABLE
c7c0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 6b  s */.        pPk
c7d0: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
c7e0: 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50  ) ? 0 : sqlite3P
c7f0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
c800: 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Tab);.        sq
c810: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e  lite3OpenTableAn
c820: 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c  dIndices(pParse,
c830: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
c840: 61 64 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ad, 0,.         
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
c870: 26 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78  &iDataCur, &iIdx
c880: 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Cur);.        /*
c890: 20 72 65 67 5b 37 5d 20 63 6f 75 6e 74 73 20 74   reg[7] counts t
c8a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
c8b0: 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ries in the tabl
c8c0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e..        ** re
c8d0: 67 5b 38 2b 69 5d 20 63 6f 75 6e 74 73 20 74 68  g[8+i] counts th
c8e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
c8f0: 69 65 73 20 69 6e 20 74 68 65 20 69 2d 74 68 20  ies in the i-th 
c900: 69 6e 64 65 78 20 0a 20 20 20 20 20 20 20 20 2a  index .        *
c910: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
c920: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c930: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29  P_Integer, 0, 7)
c940: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
c950: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c960: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c970: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
c980: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
c990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c9a0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c9b0: 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78  , 8+j); /* index
c9c0: 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72   entries counter
c9d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
c9e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c9f0: 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20  arse->nMem>=8+j 
ca00: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
ca10: 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70  t( sqlite3NoTemp
ca20: 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65 2c  sInRange(pParse,
ca30: 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20  1,7+j) );.      
ca40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca50: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
ca60: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b 20  , iDataCur, 0); 
ca70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ca80: 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70  .        loopTop
ca90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
caa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
cab0: 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20  m, 7, 1);.      
cac0: 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29    if( !isQuick )
cad0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
cae0: 61 6e 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 72  anity check on r
caf0: 65 63 6f 72 64 20 68 65 61 64 65 72 20 64 65 63  ecord header dec
cb00: 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  oding */.       
cb10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cb20: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
cb30: 6e 2c 20 69 44 61 74 61 43 75 72 2c 20 70 54 61  n, iDataCur, pTa
cb40: 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33 29 3b 0a 20  b->nCol-1, 3);. 
cb50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cb60: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
cb70: 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
cb80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cb90: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
cba0: 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c  hat all NOT NULL
cbb0: 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20   columns really 
cbc0: 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a  are NOT NULL */.
cbd0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
cbe0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
cbf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
cc00: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
cc10: 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 3b 0a 20       int jmp2;. 
cc20: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
cc30: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
cc40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
cc50: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
cc60: 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
cc70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
cc80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cc90: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
cca0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44  able(v, pTab, iD
ccb0: 61 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20  ataCur, j, 3);. 
ccc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ccd0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
cce0: 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
ccf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
cd00: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
cd10: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
cd20: 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43 6f 76  ull, 3); VdbeCov
cd30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
cd40: 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74      zErr = sqlit
cd50: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 4e  e3MPrintf(db, "N
cd60: 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25 73 2e  ULL value in %s.
cd70: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
cd80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
cdb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
cdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cdd0: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
cde0: 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20   0, 3, 0, zErr, 
cdf0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
ce00: 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79         integrity
ce10: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76  CheckResultRow(v
ce20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ce30: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ce40: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
ce50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
ce60: 56 65 72 69 66 79 20 43 48 45 43 4b 20 63 6f 6e  Verify CHECK con
ce70: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
ce80: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43      if( pTab->pC
ce90: 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61  heck && (db->fla
cea0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f  gs & SQLITE_Igno
ceb0: 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a  reChecks)==0 ){.
cec0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
ced0: 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 73 71 6c  st *pCheck = sql
cee0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
cef0: 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  db, pTab->pCheck
cf00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
cf10: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
cf20: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iled==0 ){.     
cf30: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 43         int addrC
cf40: 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  kFault = sqlite3
cf50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
cf60: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
cf70: 20 20 20 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20     int addrCkOk 
cf80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
cf90: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
cfb0: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
cfc0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
cfd0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
cfe0: 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61 43  SelfTab = iDataC
cff0: 75 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  ur + 1;.        
d000: 20 20 20 20 66 6f 72 28 6b 3d 70 43 68 65 63 6b      for(k=pCheck
d010: 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b 3e 30 3b 20  ->nExpr-1; k>0; 
d020: 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k--){.          
d030: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
d040: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
d050: 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70  Check->a[k].pExp
d060: 72 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 2c 20  r, addrCkFault, 
d070: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
d080: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
d090: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
d0a0: 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e  pParse, pCheck->
d0b0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 64 64 72  a[0].pExpr, addr
d0c0: 43 6b 4f 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  CkOk, .         
d0d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55         SQLITE_JU
d0e0: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
d0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d100: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d110: 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 29 3b 0a  , addrCkFault);.
d120: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
d130: 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30  se->iSelfTab = 0
d140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 45  ;.            zE
d150: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
d160: 6e 74 66 28 64 62 2c 20 22 43 48 45 43 4b 20 63  ntf(db, "CHECK c
d170: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
d180: 20 69 6e 20 25 73 22 2c 0a 20 20 20 20 20 20 20   in %s",.       
d190: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
d1a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
d1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d1c0: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
d1d0: 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72  g8, 0, 3, 0, zEr
d1e0: 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  r, P4_DYNAMIC);.
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
d200: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
d210: 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Row(v);.        
d220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d230: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
d240: 64 64 72 43 6b 4f 6b 29 3b 0a 20 20 20 20 20 20  ddrCkOk);.      
d250: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d260: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d270: 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63 6b  elete(db, pCheck
d280: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d290: 20 20 20 20 20 69 66 28 20 21 69 73 51 75 69 63       if( !isQuic
d2a0: 6b 20 29 7b 20 2f 2a 20 4f 6d 69 74 20 74 68 65  k ){ /* Omit the
d2b0: 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 73 74 73   remaining tests
d2c0: 20 66 6f 72 20 71 75 69 63 6b 5f 63 68 65 63 6b   for quick_check
d2d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   */.          /*
d2e0: 20 56 61 6c 69 64 61 74 65 20 69 6e 64 65 78 20   Validate index 
d2f0: 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
d300: 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20  current row */. 
d310: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
d320: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
d330: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
d340: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b  pIdx->pNext, j++
d350: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d360: 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a  nt jmp2, jmp3, j
d370: 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20  mp4, jmp5;.     
d380: 20 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69         int ckUni
d390: 71 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  q = sqlite3VdbeM
d3a0: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
d3b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d3c0: 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f  ( pPk==pIdx ) co
d3d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
d3e0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
d3f0: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
d400: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69  (pParse, pIdx, i
d410: 44 61 74 61 43 75 72 2c 20 30 2c 20 30 2c 20 26  DataCur, 0, 0, &
d420: 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20 20 20 20  jmp3,.          
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d450: 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20  Prior, r1);.    
d460: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d          pPrior =
d470: 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
d480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d490: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
d4a0: 6d 2c 20 38 2b 6a 2c 20 31 29 3b 2f 2a 20 69 6e  m, 8+j, 1);/* in
d4b0: 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63 6f  crement entry co
d4c0: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  unt */.         
d4d0: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
d4e0: 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
d4f0: 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65 20   exists for the 
d500: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f  current table ro
d510: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  w */.           
d520: 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56   jmp2 = sqlite3V
d530: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
d540: 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43 75  OP_Found, iIdxCu
d550: 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c  r+j, ckUniq, r1,
d560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e           pIdx->n
d590: 43 6f 6c 75 6d 6e 29 3b 20 56 64 62 65 43 6f 76  Column); VdbeCov
d5a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
d5b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5c0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33  eLoadString(v, 3
d5d0: 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20 20  , "row ");.     
d5e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d5f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d600: 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33 29 3b  oncat, 7, 3, 3);
d610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d620: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
d630: 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69 73 73 69  ng(v, 4, " missi
d640: 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22 29  ng from index ")
d650: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d670: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c  v, OP_Concat, 4,
d680: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
d690: 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69 74      jmp5 = sqlit
d6a0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
d6b0: 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 4, pIdx->zNa
d6c0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
d6d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d6e0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
d6f0: 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   4, 3, 3);.     
d700: 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 69 6e         jmp4 = in
d710: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
d720: 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20  ltRow(v);.      
d730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d740: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
d750: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
d760: 2f 2a 20 46 6f 72 20 55 4e 49 51 55 45 20 69 6e  /* For UNIQUE in
d770: 64 65 78 65 73 2c 20 76 65 72 69 66 79 20 74 68  dexes, verify th
d780: 61 74 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72  at only one entr
d790: 79 20 65 78 69 73 74 73 20 77 69 74 68 20 74 68  y exists with th
d7a0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
d7b0: 20 63 75 72 72 65 6e 74 20 6b 65 79 2e 20 20 54   current key.  T
d7c0: 68 65 20 65 6e 74 72 79 20 69 73 20 75 6e 69 71  he entry is uniq
d7d0: 75 65 20 69 66 20 28 31 29 20 61 6e 79 20 63 6f  ue if (1) any co
d7e0: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a 20 20 20  lumn is NULL.   
d7f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 28           ** or (
d800: 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  2) the next entr
d810: 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65 6e  y has a differen
d820: 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 20  t key */.       
d830: 20 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75       if( IsUniqu
d840: 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a  eIndex(pIdx) ){.
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d860: 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74  t uniqOk = sqlit
d870: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d880: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d890: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b         int jmp6;
d8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d8b0: 6e 74 20 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20  nt kk;.         
d8c0: 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b       for(kk=0; k
d8d0: 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  k<pIdx->nKeyCol;
d8e0: 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   kk++){.        
d8f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
d900: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
d910: 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  n[kk];.         
d920: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
d930: 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26  Col!=XN_ROWID &&
d940: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
d950: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
d960: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
d970: 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  && pTab->aCol[iC
d980: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f  ol].notNull ) co
d990: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
d9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d9b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d9c0: 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75  IsNull, r1+kk, u
d9d0: 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  niqOk);.        
d9e0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
d9f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
da00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
da10: 20 20 20 20 20 20 20 6a 6d 70 36 20 3d 20 73 71         jmp6 = sq
da20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
da30: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78  v, OP_Next, iIdx
da40: 43 75 72 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65  Cur+j); VdbeCove
da50: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
da60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
da70: 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69 71 4f 6b  beGoto(v, uniqOk
da80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
da90: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
daa0: 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20  Here(v, jmp6);. 
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
dad0: 74 28 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69  t(v, OP_IdxGT, i
dae0: 49 64 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b  IdxCur+j, uniqOk
daf0: 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db10: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e           pIdx->n
db20: 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
db30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
db40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
db50: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
db60: 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65 20   3, "non-unique 
db70: 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20 22  entry in index "
db80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
db90: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
dba0: 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20  (v, jmp5);.     
dbb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dbc0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
dbd0: 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20  (v, uniqOk);.   
dbe0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dbf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dc00: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
dc10: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p4);.           
dc20: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
dc30: 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
dc40: 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20  se, jmp3);.     
dc50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
dc60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dc70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dc80: 5f 4e 65 78 74 2c 20 69 44 61 74 61 43 75 72 2c  _Next, iDataCur,
dc90: 20 6c 6f 6f 70 54 6f 70 29 3b 20 56 64 62 65 43   loopTop); VdbeC
dca0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
dcb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
dcc0: 75 6d 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54  umpHere(v, loopT
dcd0: 6f 70 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53  op-1);.#ifndef S
dce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
dcf0: 43 4f 55 4e 54 0a 20 20 20 20 20 20 20 20 69 66  COUNT.        if
dd00: 28 20 21 69 73 51 75 69 63 6b 20 29 7b 0a 20 20  ( !isQuick ){.  
dd10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dd20: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
dd30: 20 32 2c 20 22 77 72 6f 6e 67 20 23 20 6f 66 20   2, "wrong # of 
dd40: 65 6e 74 72 69 65 73 20 69 6e 20 69 6e 64 65 78  entries in index
dd50: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   ");.          f
dd60: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
dd70: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
dd80: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
dd90: 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, j++){.       
dda0: 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49       if( pPk==pI
ddb0: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
ddc0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ddd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dde0: 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75  OP_Count, iIdxCu
ddf0: 72 2b 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  r+j, 3);.       
de00: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
de10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
de20: 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c 20 30 2c 20   OP_Eq, 8+j, 0, 
de30: 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  3); VdbeCoverage
de40: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
de50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
de60: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
de70: 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  OTNULL);.       
de80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de90: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c  LoadString(v, 4,
dea0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
deb0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dec0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ded0: 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 32 2c  OP_Concat, 4, 2,
dee0: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
def0: 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52   integrityCheckR
df00: 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20  esultRow(v);.   
df10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df20: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
df30: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  addr);.         
df40: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
df50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
df60: 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
df70: 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a  .      } .    }.
df80: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74      {.      stat
df90: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
dfa0: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
dfb0: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20  INENO(2);.      
dfc0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
dfd0: 65 4f 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b  eOpList endCode[
dfe0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
dff0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20  OP_AddImm,      
e000: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
e010: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
e020: 20 20 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65      { OP_IfNotZe
e030: 72 6f 2c 20 20 20 31 2c 20 34 2c 20 20 20 20 20  ro,   1, 4,     
e040: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a     0},    /* 1 *
e050: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53  /.        { OP_S
e060: 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33  tring8,     0, 3
e070: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
e080: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 2 */.        
e090: 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  { OP_ResultRow, 
e0a0: 20 20 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30    3, 1,        0
e0b0: 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20  },    /* 3 */.  
e0c0: 20 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c        { OP_Halt,
e0d0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
e0e0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 34       0},    /* 4
e0f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
e100: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c  _String8,     0,
e110: 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   3,        0},  
e120: 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20    /* 5 */.      
e130: 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20    { OP_Goto,    
e140: 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
e150: 20 30 7d 2c 20 20 20 20 2f 2a 20 36 20 2a 2f 0a   0},    /* 6 */.
e160: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56        };.      V
e170: 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20 20  dbeOp *aOp;..   
e180: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
e190: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
e1a0: 20 41 72 72 61 79 53 69 7a 65 28 65 6e 64 43 6f   ArraySize(endCo
e1b0: 64 65 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c  de), endCode, iL
e1c0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f  n);.      if( aO
e1d0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 70  p ){.        aOp
e1e0: 5b 30 5d 2e 70 32 20 3d 20 31 2d 6d 78 45 72 72  [0].p2 = 1-mxErr
e1f0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d  ;.        aOp[2]
e200: 2e 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41  .p4type = P4_STA
e210: 54 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  TIC;.        aOp
e220: 5b 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b  [2].p4.z = "ok";
e230: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e  .        aOp[5].
e240: 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54  p4type = P4_STAT
e250: 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  IC;.        aOp[
e260: 35 5d 2e 70 34 2e 7a 20 3d 20 28 63 68 61 72 2a  5].p4.z = (char*
e270: 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53  )sqlite3ErrStr(S
e280: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 3b 0a  QLITE_CORRUPT);.
e290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
e2a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e2b0: 33 28 76 2c 20 30 2c 20 73 71 6c 69 74 65 33 56  3(v, 0, sqlite3V
e2c0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e2d0: 29 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )-2);.    }.  }.
e2e0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
e2f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
e300: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
e310: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e320: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
e330: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
e340: 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20  encoding.  **   
e350: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
e360: 3d 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31  = "utf-8"|"utf-1
e370: 36 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75  6"|"utf-16le"|"u
e380: 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20  tf-16be".  **.  
e390: 2a 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74 20  ** In its first 
e3a0: 66 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d  form, this pragm
e3b0: 61 20 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e  a returns the en
e3c0: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61  coding of the ma
e3d0: 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  in.  ** database
e3e0: 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
e3f0: 65 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  e is not initial
e400: 69 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74  ized, it is init
e410: 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a  ialized now..  *
e420: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
e430: 64 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70  d form of this p
e440: 72 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70  ragma is a no-op
e450: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   if the main dat
e460: 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
e470: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
e480: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
e490: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
e4a0: 74 20 73 65 74 73 20 74 68 65 20 64 65 66 61 75  t sets the defau
e4b0: 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67  lt.  ** encoding
e4c0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
e4d0: 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ed for the main 
e4e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
e4f0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a   a new file.  **
e500: 20 69 73 20 63 72 65 61 74 65 64 2e 20 49 66 20   is created. If 
e510: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e  an existing main
e520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
e530: 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74  s opened, then t
e540: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
e550: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f  text encoding fo
e560: 72 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  r the existing d
e570: 61 74 61 62 61 73 65 20 69 73 20 75 73 65 64 2e  atabase is used.
e580: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61  .  ** .  ** In a
e590: 6c 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61 74  ll cases new dat
e5a0: 61 62 61 73 65 73 20 63 72 65 61 74 65 64 20 75  abases created u
e5b0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
e5c0: 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a  command are.  **
e5d0: 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20   created to use 
e5e0: 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74  the same default
e5f0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
e600: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
e610: 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65  ase. If.  ** the
e620: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 68   main database h
e630: 61 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74  as not been init
e640: 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63  ialized and/or c
e650: 72 65 61 74 65 64 20 77 68 65 6e 20 41 54 54 41  reated when ATTA
e660: 43 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75  CH.  ** is execu
e670: 74 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e  ted, this is don
e680: 65 20 62 65 66 6f 72 65 20 74 68 65 20 41 54 54  e before the ATT
e690: 41 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  ACH operation.. 
e6a0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20   **.  ** In the 
e6b0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73  second form this
e6c0: 20 70 72 61 67 6d 61 20 73 65 74 73 20 74 68 65   pragma sets the
e6d0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74   text encoding t
e6e0: 6f 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a  o be used in.  *
e6f0: 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66  * new database f
e700: 69 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69  iles created usi
e710: 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
e720: 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f   handle. It is o
e730: 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20  nly.  ** useful 
e740: 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64  if invoked immed
e750: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
e760: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
e770: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
e780: 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b  gTyp_ENCODING: {
e790: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
e7a0: 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65  t struct EncName
e7b0: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
e7c0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65  Name;.      u8 e
e7d0: 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d  nc;.    } encnam
e7e0: 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  es[] = {.      {
e7f0: 20 22 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c   "UTF8",     SQL
e800: 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20  ITE_UTF8        
e810: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  },.      { "UTF-
e820: 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54  8",    SQLITE_UT
e830: 46 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a  F8        },  /*
e840: 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74   Must be element
e850: 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20   [1] */.      { 
e860: 22 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49  "UTF-16le", SQLI
e870: 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d  TE_UTF16LE     }
e880: 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c  ,  /* Must be el
e890: 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20  ement [2] */.   
e8a0: 20 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c     { "UTF-16be",
e8b0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
e8c0: 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20      },  /* Must 
e8d0: 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a  be element [3] *
e8e0: 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36  /.      { "UTF16
e8f0: 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46  le",  SQLITE_UTF
e900: 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20  16LE     },.    
e910: 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20    { "UTF16be",  
e920: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20  SQLITE_UTF16BE  
e930: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
e940: 54 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20  TF-16",   0     
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20               }, 
e960: 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  /* SQLITE_UTF16N
e970: 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b  ATIVE */.      {
e980: 20 22 55 54 46 31 36 22 2c 20 20 20 20 30 20 20   "UTF16",    0  
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46  }, /* SQLITE_UTF
e9b0: 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20  16NATIVE */.    
e9c0: 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d    { 0, 0 }.    }
e9d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
e9e0: 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63  ct EncName *pEnc
e9f0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
ea00: 74 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47  t ){    /* "PRAG
ea10: 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a  MA encoding" */.
ea20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ea30: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
ea40: 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  se) ) goto pragm
ea50: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73  a_out;.      ass
ea60: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
ea70: 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d  LITE_UTF8].enc==
ea80: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20  SQLITE_UTF8 );. 
ea90: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63       assert( enc
eaa0: 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46  names[SQLITE_UTF
eab0: 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54  16LE].enc==SQLIT
eac0: 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20  E_UTF16LE );.   
ead0: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
eae0: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mes[SQLITE_UTF16
eaf0: 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  BE].enc==SQLITE_
eb00: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20  UTF16BE );.     
eb10: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
eb20: 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e  t(v, encnames[EN
eb30: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a  C(pParse->db)].z
eb40: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
eb50: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
eb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41           /* "PRA
eb70: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58  GMA encoding = X
eb80: 58 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  XX" */.      /* 
eb90: 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20  Only change the 
eba0: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e  value of sqlite.
ebb0: 65 6e 63 20 69 66 20 74 68 65 20 64 61 74 61 62  enc if the datab
ebc0: 61 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f  ase handle is no
ebd0: 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69  t.      ** initi
ebe0: 61 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d  alized. If the m
ebf0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 78 69  ain database exi
ec00: 73 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c  sts, the new sql
ec10: 69 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20  ite.enc value.  
ec20: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f      ** will be o
ec30: 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20  verwritten when 
ec40: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65  the schema is ne
ec50: 78 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74  xt loaded. If it
ec60: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
ec70: 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ** already exist
ec80: 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72  s, it will be cr
ec90: 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65  eated to use the
eca0: 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61   new encoding va
ecb0: 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lue..      */.  
ecc0: 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 20      if( .       
ecd0: 20 21 28 44 62 48 61 73 50 72 6f 70 65 72 74 79   !(DbHasProperty
ece0: 28 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  (db, 0, DB_Schem
ecf0: 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20  aLoaded)) || .  
ed00: 20 20 20 20 20 20 44 62 48 61 73 50 72 6f 70 65        DbHasPrope
ed10: 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d  rty(db, 0, DB_Em
ed20: 70 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  pty) .      ){. 
ed30: 20 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d         for(pEnc=
ed40: 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45  &encnames[0]; pE
ed50: 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b  nc->zName; pEnc+
ed60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
ed70: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
ed80: 43 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63  Cmp(zRight, pEnc
ed90: 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ->zName) ){.    
eda0: 20 20 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45          SCHEMA_E
edb0: 4e 43 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29  NC(db) = ENC(db)
edc0: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
edd0: 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70     pEnc->enc ? p
ede0: 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54  Enc->enc : SQLIT
edf0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
ee00: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
ee10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ee20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ee30: 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65  if( !pEnc->zName
ee40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ee50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ee60: 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74  arse, "unsupport
ee70: 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22  ed encoding: %s"
ee80: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
ee90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
eea0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
eeb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
eec0: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
eed0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eee0: 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  MIT_SCHEMA_VERSI
eef0: 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a  ON_PRAGMAS.  /*.
ef00: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
ef10: 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65  chema.]schema_ve
ef20: 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41  rsion.  **   PRA
ef30: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68  GMA [schema.]sch
ef40: 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69  ema_version = <i
ef50: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
ef60: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
ef70: 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e  ma.]user_version
ef80: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
ef90: 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72  schema.]user_ver
efa0: 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e  sion = <integer>
efb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  **.  **   PRA
efc0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65  GMA [schema.]fre
efd0: 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a  elist_count.  **
efe0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
eff0: 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72  schema.]data_ver
f000: 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  sion.  **.  **  
f010: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f020: 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a  ]application_id.
f030: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
f040: 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69  chema.]applicati
f050: 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72  on_id = <integer
f060: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  >.  **.  ** The 
f070: 70 72 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f  pragma's schema_
f080: 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72  version and user
f090: 5f 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65  _version are use
f0a0: 64 20 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a  d to set or get.
f0b0: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
f0c0: 66 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  f the schema-ver
f0d0: 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65  sion and user-ve
f0e0: 72 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76  rsion, respectiv
f0f0: 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74  ely. Both.  ** t
f100: 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f  he schema-versio
f110: 6e 20 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76  n and the user-v
f120: 65 72 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69  ersion are 32-bi
f130: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
f140: 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  s.  ** stored in
f150: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
f160: 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ader..  **.  ** 
f170: 54 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69  The schema-cooki
f180: 65 20 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c  e is usually onl
f190: 79 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e  y manipulated in
f1a0: 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69  ternally by SQLi
f1b0: 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69  te. It.  ** is i
f1c0: 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51  ncremented by SQ
f1d0: 4c 69 74 65 20 77 68 65 6e 65 76 65 72 20 74 68  Lite whenever th
f1e0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
f1f0: 61 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62  a is modified (b
f200: 79 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20  y.  ** creating 
f210: 6f 72 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61  or dropping a ta
f220: 62 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54  ble or index). T
f230: 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
f240: 6e 20 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a  n is used by.  *
f250: 2a 20 53 51 4c 69 74 65 20 65 61 63 68 20 74 69  * SQLite each ti
f260: 6d 65 20 61 20 71 75 65 72 79 20 69 73 20 65 78  me a query is ex
f270: 65 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65  ecuted to ensure
f280: 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e   that the intern
f290: 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66  al cache.  ** of
f2a0: 20 74 68 65 20 73 63 68 65 6d 61 20 75 73 65 64   the schema used
f2b0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
f2c0: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61  the SQL query ma
f2d0: 74 63 68 65 73 20 74 68 65 20 73 63 68 65 6d 61  tches the schema
f2e0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   of.  ** the dat
f2f0: 61 62 61 73 65 20 61 67 61 69 6e 73 74 20 77 68  abase against wh
f300: 69 63 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64  ich the compiled
f310: 20 71 75 65 72 79 20 69 73 20 61 63 74 75 61 6c   query is actual
f320: 6c 79 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  ly executed..  *
f330: 2a 20 53 75 62 76 65 72 74 69 6e 67 20 74 68 69  * Subverting thi
f340: 73 20 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75  s mechanism by u
f350: 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68  sing "PRAGMA sch
f360: 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20  ema_version" to 
f370: 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
f380: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69  schema-version i
f390: 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61  s potentially da
f3a0: 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20  ngerous and may 
f3b0: 6c 65 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a  lead to program.
f3c0: 20 20 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20    ** crashes or 
f3d0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
f3e0: 69 6f 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61  ion. Use with ca
f3f0: 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a  ution!.  **.  **
f400: 20 54 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f   The user-versio
f410: 6e 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  n is not used in
f420: 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69  ternally by SQLi
f430: 74 65 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73  te. It may be us
f440: 65 64 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69  ed by.  ** appli
f450: 63 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20  cations for any 
f460: 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20  purpose..  */.  
f470: 63 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 41  case PragTyp_HEA
f480: 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20  DER_VALUE: {.   
f490: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70   int iCookie = p
f4a0: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f  Pragma->iArg;  /
f4b0: 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74  * Which cookie t
f4c0: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
f4d0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
f4e0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
f4f0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  Db);.    if( zRi
f500: 67 68 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d  ght && (pPragma-
f510: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
f520: 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30  Flg_ReadOnly)==0
f530: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69   ){.      /* Wri
f540: 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
f550: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
f560: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
f570: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73  nst VdbeOpList s
f580: 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20  etCookie[] = {. 
f590: 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e         { OP_Tran
f5a0: 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20  saction,    0,  
f5b0: 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20  1,  0},    /* 0 
f5c0: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
f5d0: 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  SetCookie,      
f5e0: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  0,  0},    /
f5f0: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  * 1 */.      };.
f600: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
f610: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
f620: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
f630: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
f640: 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69  raySize(setCooki
f650: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
f660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f670: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
f680: 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73  ze(setCookie), s
f690: 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  etCookie, 0);.  
f6a0: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
f6b0: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
f6c0: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
f6d0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
f6e0: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
f6f0: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
f700: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20      aOp[1].p2 = 
f710: 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61  iCookie;.      a
f720: 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74  Op[1].p3 = sqlit
f730: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
f740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f750: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70 65   /* Read the spe
f760: 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61  cified cookie va
f770: 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  lue */.      sta
f780: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
f790: 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b  List readCookie[
f7a0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
f7b0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
f7c0: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20      0,  0,  0}, 
f7d0: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
f7e0: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
f7f0: 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20  ie,      0,  1, 
f800: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
f810: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73          { OP_Res
f820: 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c  ultRow,       1,
f830: 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d    1,  0}.      }
f840: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
f850: 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  aOp;.      sqlit
f860: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
f870: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20  llocRequired(v, 
f880: 41 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f  ArraySize(readCo
f890: 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f  okie));.      aO
f8a0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
f8b0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
f8c0: 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65  ySize(readCookie
f8d0: 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b  ),readCookie,0);
f8e0: 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f  .      if( ONLY_
f8f0: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
f900: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
f910: 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  k;.      aOp[0].
f920: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
f930: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
f940: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33  .      aOp[1].p3
f950: 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20   = iCookie;.    
f960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75    sqlite3VdbeReu
f970: 73 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a  sable(v);.    }.
f980: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
f990: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
f9a0: 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  IT_SCHEMA_VERSIO
f9b0: 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  N_PRAGMAS */..#i
f9c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f9d0: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
f9e0: 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  DIAGS.  /*.  ** 
f9f0: 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65    PRAGMA compile
fa00: 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20  _options.  **.  
fa10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
fa20: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69  mes of all compi
fa30: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
fa40: 75 73 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  used in this bui
fa50: 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74  ld,.  ** one opt
fa60: 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a  ion per row..  *
fa70: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
fa80: 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53  _COMPILE_OPTIONS
fa90: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  : {.    int i = 
faa0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
fab0: 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61  r *zOpt;.    pPa
fac0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20  rse->nMem = 1;. 
fad0: 20 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20     while( (zOpt 
fae0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c  = sqlite3_compil
faf0: 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29  eoption_get(i++)
fb00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
fb10: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
fb20: 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b  ing(v, 1, zOpt);
fb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
fb50: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b  esultRow, 1, 1);
fb60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fb70: 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 76  e3VdbeReusable(v
fb80: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
fb90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fba0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
fbb0: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69  ION_DIAGS */..#i
fbc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fbd0: 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T_WAL.  /*.  ** 
fbe0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
fbf0: 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  .]wal_checkpoint
fc00: 20 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c   = passive|full|
fc10: 72 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65  restart|truncate
fc20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  **.  ** Check
fc30: 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61  point the databa
fc40: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
fc50: 50 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43  PragTyp_WAL_CHEC
fc60: 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e  KPOINT: {.    in
fc70: 74 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a  t iBt = (pId2->z
fc80: 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f  ?iDb:SQLITE_MAX_
fc90: 41 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69  ATTACHED);.    i
fca0: 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54  nt eMode = SQLIT
fcb0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
fcc0: 53 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52  SIVE;.    if( zR
fcd0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66  ight ){.      if
fce0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fcf0: 28 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29  (zRight, "full")
fd00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
fd10: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
fd20: 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20  ECKPOINT_FULL;. 
fd30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
fd40: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
fd50: 69 67 68 74 2c 20 22 72 65 73 74 61 72 74 22 29  ight, "restart")
fd60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
fd70: 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48  Mode = SQLITE_CH
fd80: 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
fd90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
fda0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fdb0: 28 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61  (zRight, "trunca
fdc0: 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
fdd0: 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
fde0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
fdf0: 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  NCATE;.      }. 
fe00: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
fe10: 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73  >nMem = 3;.    s
fe20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fe30: 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  (v, OP_Checkpoin
fe40: 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31  t, iBt, eMode, 1
fe50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fe60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
fe70: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b  esultRow, 1, 3);
fe80: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
fe90: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
fea0: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
feb0: 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47  oint.  **   PRAG
fec0: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
fed0: 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20  point = N.  **. 
fee0: 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20   ** Configure a 
fef0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ff00: 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ion to automatic
ff10: 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20  ally checkpoint 
ff20: 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  a database.  ** 
ff30: 61 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69  after accumulati
ff40: 6e 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74  ng N frames in t
ff50: 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79  he log. Or query
ff60: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
ff70: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e   value.  ** of N
ff80: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
ff90: 61 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48  agTyp_WAL_AUTOCH
ffa0: 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20  ECKPOINT: {.    
ffb0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
ffc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
ffd0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
ffe0: 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  b, sqlite3Atoi(z
fff0: 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20  Right));.    }. 
10000 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
10010 6e 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62  nt(v, .       db
10020 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d  ->xWalCallback==
10030 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
10040 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20  tHook ? .       
10050 20 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54      SQLITE_PTR_T
10060 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72  O_INT(db->pWalAr
10070 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62  g) : 0);.  }.  b
10080 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
10090 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
100a0 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20  shrink_memory.  
100b0 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
100c0 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34  TATION-OF: R-234
100d0 34 35 2d 34 36 31 30 39 20 54 68 69 73 20 70 72  45-46109 This pr
100e0 61 67 6d 61 20 63 61 75 73 65 73 20 74 68 65 20  agma causes the 
100f0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f  database.  ** co
10100 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63  nnection on whic
10110 68 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  h it is invoked 
10120 74 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d 75  to free up as mu
10130 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a  ch memory as it.
10140 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c    ** can, by cal
10150 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f  ling sqlite3_db_
10160 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
10170 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
10180 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d  agTyp_SHRINK_MEM
10190 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  ORY: {.    sqlit
101a0 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
101b0 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72  mory(db);.    br
101c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
101d0 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69   **  PRAGMA opti
101e0 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  mize.  **  PRAGM
101f0 41 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29  A optimize(MASK)
10200 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63  .  **  PRAGMA sc
10210 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20  hema.optimize.  
10220 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d  **  PRAGMA schem
10230 61 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29  a.optimize(MASK)
10240 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d  .  **.  ** Attem
10250 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  pt to optimize t
10260 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c  he database.  Al
10270 6c 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70  l schemas are op
10280 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66  timized in the f
10290 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f  irst.  ** two fo
102a0 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  rms, and only th
102b0 65 20 73 70 65 63 69 66 69 65 64 20 73 63 68 65  e specified sche
102c0 6d 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  ma is optimized 
102d0 69 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74 77  in the latter tw
102e0 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
102f0 20 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69   details of opti
10300 6d 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72  mizations perfor
10310 6d 65 64 20 62 79 20 74 68 69 73 20 70 72 61 67  med by this prag
10320 6d 61 20 61 72 65 20 65 78 70 65 63 74 65 64 0a  ma are expected.
10330 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61    ** to change a
10340 6e 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20  nd improve over 
10350 74 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69  time.  Applicati
10360 6f 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63  ons should antic
10370 69 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20  ipate that.  ** 
10380 74 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c  this pragma will
10390 20 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74   perform new opt
103a0 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75  imizations in fu
103b0 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20  ture releases.. 
103c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74   **.  ** The opt
103d0 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69  ional argument i
103e0 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
103f0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
10400 70 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  perform:.  **.  
10410 2a 2a 20 20 20 20 30 78 30 30 30 31 20 20 20 20  **    0x0001    
10420 44 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20  Debugging mode. 
10430 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   Do not actually
10440 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74   perform any opt
10450 69 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  imizations.  ** 
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
10470 20 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20   instead return 
10480 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  one line of text
10490 20 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69   for each optimi
104a0 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20  zation.  **     
104b0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 77 6f           that wo
104c0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f  uld have been do
104d0 6e 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61  ne.  Off by defa
104e0 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ult..  **.  **  
104f0 20 20 30 78 30 30 30 32 20 20 20 20 52 75 6e 20    0x0002    Run 
10500 41 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65  ANALYZE on table
10510 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e  s that might ben
10520 65 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66  efit.  On by def
10530 61 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20  ault..  **      
10540 20 20 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f          See belo
10550 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  w for additional
10560 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
10570 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30  **.  **    0x000
10580 34 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d  4    (Not yet im
10590 70 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72  plemented) Recor
105a0 64 20 75 73 61 67 65 20 61 6e 64 20 70 65 72 66  d usage and perf
105b0 6f 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20  ormance .  **   
105c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72             infor
105d0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
105e0 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20  current session 
105f0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  in the.  **     
10600 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
10610 65 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  e file so that i
10620 74 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61  t will be availa
10630 62 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65  ble to "optimize
10640 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ".  **          
10650 20 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20      pragmas run 
10660 62 79 20 66 75 74 75 72 65 20 64 61 74 61 62 61  by future databa
10670 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
10680 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30    **.  **    0x0
10690 30 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20  008    (Not yet 
106a0 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65  implemented) Cre
106b0 61 74 65 20 69 6e 64 65 78 65 73 20 74 68 61 74  ate indexes that
106c0 20 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a   might have.  **
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
106e0 65 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65  en helpful to re
106f0 63 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a  cent queries.  *
10700 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75  *.  ** The defau
10710 6c 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61  lt MASK is and a
10720 6c 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30  lways shall be 0
10730 78 66 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d  xfffe.  0xfffe m
10740 65 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c  eans perform all
10750 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74  .  ** of the opt
10760 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65  imizations liste
10770 64 20 61 62 6f 76 65 20 65 78 63 65 70 74 20 44  d above except D
10780 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75  ebug Mode, inclu
10790 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70  ding new.  ** op
107a0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74  timizations that
107b0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
107c0 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20 49 66  en invented.  If
107d0 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f   new optimizatio
107e0 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65 76 65 72  ns are.  ** ever
107f0 20 61 64 64 65 64 20 74 68 61 74 20 73 68 6f 75   added that shou
10800 6c 64 20 62 65 20 6f 66 66 20 62 79 20 64 65 66  ld be off by def
10810 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d  ault, those off-
10820 62 79 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a  by-default .  **
10830 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
10840 69 6c 6c 20 68 61 76 65 20 62 69 74 6d 61 73 6b  ill have bitmask
10850 73 20 6f 66 20 30 78 31 30 30 30 30 20 6f 72 20  s of 0x10000 or 
10860 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  larger..  **.  *
10870 2a 20 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20  * DETERMINATION 
10880 4f 46 20 57 48 45 4e 20 54 4f 20 52 55 4e 20 41  OF WHEN TO RUN A
10890 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a  NALYZE.  **.  **
108a0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
108b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
108c0 61 20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79  a table is analy
108d0 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69 66 20 61  zed if only if a
108e0 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66  ll of.  ** the f
108f0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
10900 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29  e:.  **.  ** (1)
10910 20 4d 41 53 4b 20 62 69 74 20 30 78 30 32 20 69   MASK bit 0x02 i
10920 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  s set..  **.  **
10930 20 28 32 29 20 54 68 65 20 71 75 65 72 79 20 70   (2) The query p
10940 6c 61 6e 6e 65 72 20 75 73 65 64 20 73 71 6c 69  lanner used sqli
10950 74 65 5f 73 74 61 74 31 2d 73 74 79 6c 65 20 73  te_stat1-style s
10960 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6f 6e  tatistics for on
10970 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f  e or.  **     mo
10980 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68  re indexes of th
10990 65 20 74 61 62 6c 65 20 61 74 20 73 6f 6d 65 20  e table at some 
109a0 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65  point during the
109b0 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a   lifetime of.  *
109c0 2a 20 20 20 20 20 74 68 65 20 63 75 72 72 65 6e  *     the curren
109d0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  t connection..  
109e0 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20  **.  ** (3) One 
109f0 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
10a00 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
10a10 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61   currently unana
10a20 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20  lyzed OR.  **   
10a30 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    the number of 
10a40 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
10a50 65 20 68 61 73 20 69 6e 63 72 65 61 73 65 64 20  e has increased 
10a60 62 79 20 32 35 20 74 69 6d 65 73 20 6f 72 20 6d  by 25 times or m
10a70 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e  ore.  **     sin
10a80 63 65 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65  ce the last time
10a90 20 41 4e 41 4c 59 5a 45 20 77 61 73 20 72 75 6e   ANALYZE was run
10aa0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
10ab0 72 75 6c 65 73 20 66 6f 72 20 77 68 65 6e 20 74  rules for when t
10ac0 61 62 6c 65 73 20 61 72 65 20 61 6e 61 6c 79 7a  ables are analyz
10ad0 65 64 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f  ed are likely to
10ae0 20 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20   change in.  ** 
10af0 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e  future releases.
10b00 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
10b10 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b  gTyp_OPTIMIZE: {
10b20 0a 20 20 20 20 69 6e 74 20 69 44 62 4c 61 73 74  .    int iDbLast
10b30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
10b40 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
10b50 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 73 63  point for the sc
10b60 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  hema loop */.   
10b70 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20   int iTabCur;   
10b80 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
10b90 72 20 66 6f 72 20 61 20 74 61 62 6c 65 20 77 68  r for a table wh
10ba0 6f 73 65 20 73 69 7a 65 20 6e 65 65 64 73 20 63  ose size needs c
10bb0 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48  hecking */.    H
10bc0 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
10bd0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76        /* Loop ov
10be0 65 72 20 74 61 62 6c 65 73 20 6f 66 20 61 20 73  er tables of a s
10bf0 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68  chema */.    Sch
10c00 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20  ema *pSchema;   
10c10 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
10c20 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  nt schema */.   
10c30 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
10c40 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
10c50 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  le in the schema
10c60 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
10c70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
10c80 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66 20 74 68  * An index of th
10c90 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c  e table */.    L
10ca0 6f 67 45 73 74 20 73 7a 54 68 72 65 73 68 6f 6c  ogEst szThreshol
10cb0 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 74 68  d;    /* Size th
10cc0 72 65 73 68 6f 6c 64 20 61 62 6f 76 65 20 77 68  reshold above wh
10cd0 69 63 68 20 72 65 61 6e 61 6c 79 73 69 73 20 69  ich reanalysis i
10ce0 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20 63  s needd */.    c
10cf0 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20  har *zSubSql;   
10d00 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
10d10 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 4f  tement for the O
10d20 50 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f 64 65  P_SqlExec opcode
10d30 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d 61   */.    u32 opMa
10d40 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
10d50 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61 74  * Mask of operat
10d60 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 20  ions to perform 
10d70 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67  */..    if( zRig
10d80 68 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61  ht ){.      opMa
10d90 73 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65  sk = (u32)sqlite
10da0 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
10db0 20 20 20 20 20 69 66 28 20 28 6f 70 4d 61 73 6b       if( (opMask
10dc0 20 26 20 30 78 30 32 29 3d 3d 30 20 29 20 62 72   & 0x02)==0 ) br
10dd0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
10de0 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30        opMask = 0
10df0 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20  xfffe;.    }.   
10e00 20 69 54 61 62 43 75 72 20 3d 20 70 50 61 72 73   iTabCur = pPars
10e10 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66  e->nTab++;.    f
10e20 6f 72 28 69 44 62 4c 61 73 74 20 3d 20 7a 44 62  or(iDbLast = zDb
10e30 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20  ?iDb:db->nDb-1; 
10e40 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44  iDb<=iDbLast; iD
10e50 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b++){.      if( 
10e60 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  iDb==1 ) continu
10e70 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
10e80 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
10e90 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
10ea0 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64       pSchema = d
10eb0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
10ec0 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ema;.      for(k
10ed0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
10ee0 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
10ef0 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  sh); k; k=sqlite
10f00 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
10f10 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
10f20 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
10f30 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20  ata(k);..       
10f40 20 2f 2a 20 49 66 20 74 61 62 6c 65 20 70 54 61   /* If table pTa
10f50 62 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75  b has not been u
10f60 73 65 64 20 69 6e 20 61 20 77 61 79 20 74 68 61  sed in a way tha
10f70 74 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20  t would benefit 
10f80 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
10f90 68 61 76 69 6e 67 20 61 6e 61 6c 79 73 69 73 20  having analysis 
10fa0 73 74 61 74 69 73 74 69 63 73 20 64 75 72 69 6e  statistics durin
10fb0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
10fc0 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70  ssion, then skip
10fd0 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   it..        ** 
10fe0 54 68 69 73 20 61 6c 73 6f 20 68 61 73 20 74 68  This also has th
10ff0 65 20 65 66 66 65 63 74 20 6f 66 20 73 6b 69 70  e effect of skip
11000 70 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ping virtual tab
11010 6c 65 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f  les and views */
11020 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
11030 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
11040 46 5f 53 74 61 74 73 55 73 65 64 29 3d 3d 30 20  F_StatsUsed)==0 
11050 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
11060 20 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a       /* Reanalyz
11070 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  e if the table i
11080 73 20 32 35 20 74 69 6d 65 73 20 6c 61 72 67 65  s 25 times large
11090 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20  r than the last 
110a0 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20  analysis */.    
110b0 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20      szThreshold 
110c0 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
110d0 73 74 20 2b 20 34 36 3b 20 61 73 73 65 72 74 28  st + 46; assert(
110e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32   sqlite3LogEst(2
110f0 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20 20  5)==46 );.      
11100 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
11110 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
11120 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
11130 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
11140 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
11150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
11160 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20  zThreshold = 0; 
11170 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a  /* Always analyz
11180 65 20 69 66 20 61 6e 79 20 69 6e 64 65 78 20 6c  e if any index l
11190 61 63 6b 73 20 73 74 61 74 69 73 74 69 63 73 20  acks statistics 
111a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
111b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
111c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
111d0 20 20 20 20 69 66 28 20 73 7a 54 68 72 65 73 68      if( szThresh
111e0 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  old ){.         
111f0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
11200 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75  e(pParse, iTabCu
11210 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
11220 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
11230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11240 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
11250 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43 75 72  Smaller, iTabCur
11260 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
11270 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11280 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
11290 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26  dr(v)+2+(opMask&
112a0 31 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64 29  1), szThreshold)
112b0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
112c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
112d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
112e0 53 75 62 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  SubSql = sqlite3
112f0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 41 4e 41  MPrintf(db, "ANA
11300 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77  LYZE \"%w\".\"%w
11310 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
11340 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61  b].zDbSName, pTa
11350 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
11360 20 20 20 69 66 28 20 6f 70 4d 61 73 6b 20 26 20     if( opMask & 
11370 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
11380 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
11390 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
113a0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
113b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113c0 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
113d0 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62 53   0, r1, 0, zSubS
113e0 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ql, P4_DYNAMIC);
113f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11410 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 31  OP_ResultRow, r1
11420 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
11430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
11440 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11450 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20  (v, OP_SqlExec, 
11460 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c  0, 0, 0, zSubSql
11470 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
11480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11490 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
114a0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
114b0 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20  OP_Expire);.    
114c0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
114d0 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62  .  **   PRAGMA b
114e0 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a  usy_timeout.  **
114f0 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74     PRAGMA busy_t
11500 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a  imeout = N.  **.
11510 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    ** Call sqlite
11520 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
11530 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74  b, N).  Return t
11540 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f  he current timeo
11550 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66  ut value.  ** if
11560 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66   one is set.  If
11570 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72   no busy handler
11580 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20   or a different 
11590 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20  busy handler is 
115a0 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20  set.  ** then 0 
115b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65  is returned.  Se
115c0 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74  tting the busy_t
115d0 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e  imeout to 0 or n
115e0 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73  egative.  ** dis
115f0 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75  ables the timeou
11600 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65  t..  */.  /*case
11610 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49   PragTyp_BUSY_TI
11620 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a  MEOUT*/ default:
11630 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   {.    assert( p
11640 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
11650 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  ==PragTyp_BUSY_T
11660 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66  IMEOUT );.    if
11670 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
11680 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
11690 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74  imeout(db, sqlit
116a0 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b  e3Atoi(zRight));
116b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
116c0 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
116d0 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a  ->busyTimeout);.
116e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
116f0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
11700 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  MA soft_heap_lim
11710 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  it.  **   PRAGMA
11720 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
11730 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   = N.  **.  ** I
11740 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
11750 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30 20  : R-26343-45930 
11760 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76 6f  This pragma invo
11770 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  kes the.  ** sql
11780 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
11790 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66 61  imit64() interfa
117a0 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67 75  ce with the argu
117b0 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a  ment N, if N is.
117c0 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61    ** specified a
117d0 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61  nd is a non-nega
117e0 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20  tive integer..  
117f0 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
11800 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30 37  N-OF: R-64451-07
11810 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65 61  163 The soft_hea
11820 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20 61  p_limit pragma a
11830 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75 72  lways.  ** retur
11840 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65  ns the same inte
11850 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ger that would b
11860 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
11870 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73  e.  ** sqlite3_s
11880 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
11890 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65 20  (-1) C-language 
118a0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
118b0 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 4f   case PragTyp_SO
118c0 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b  FT_HEAP_LIMIT: {
118d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
118e0 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52  64 N;.    if( zR
118f0 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33 44  ight && sqlite3D
11900 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
11910 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45  ght, &N)==SQLITE
11920 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11930 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
11940 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d  imit64(N);.    }
11950 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11960 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  eInt(v, sqlite3_
11970 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
11980 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61  4(-1));.    brea
11990 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
119a0 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61  *   PRAGMA threa
119b0 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ds.  **   PRAGMA
119c0 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a   threads = N.  *
119d0 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65  *.  ** Configure
119e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
119f0 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68  ber of worker th
11a00 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74  reads.  Return t
11a10 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69  he new.  ** maxi
11a20 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74  mum, which might
11a30 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65   be less than re
11a40 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
11a50 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48 52  case PragTyp_THR
11a60 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69  EADS: {.    sqli
11a70 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20  te3_int64 N;.   
11a80 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20   if( zRight.    
11a90 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
11aa0 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c  HexToI64(zRight,
11ab0 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a   &N)==SQLITE_OK.
11ac0 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20       && N>=0.   
11ad0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11ae0 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49  3_limit(db, SQLI
11af0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
11b00 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e  THREADS, (int)(N
11b10 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20  &0x7fffffff));. 
11b20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
11b30 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69  ingleInt(v, sqli
11b40 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51  te3_limit(db, SQ
11b50 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
11b60 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29 3b  R_THREADS, -1));
11b70 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11b80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
11b90 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
11ba0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
11bb0 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70  T).  /*.  ** Rep
11bc0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
11bd0 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f  state of file lo
11be0 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  gs for all datab
11bf0 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ases.  */.  case
11c00 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54   PragTyp_LOCK_ST
11c10 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61 74  ATUS: {.    stat
11c20 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
11c30 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b  onst azLockName[
11c40 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c  ] = {.      "unl
11c50 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22  ocked", "shared"
11c60 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22 70  , "reserved", "p
11c70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73  ending", "exclus
11c80 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ive".    };.    
11c90 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73  int i;.    pPars
11ca0 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20  e->nMem = 2;.   
11cb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11cc0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11cd0 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
11ce0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11cf0 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  State = "unknown
11d00 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ";.      int j;.
11d10 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
11d20 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30  b[i].zDbSName==0
11d30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11d40 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62     pBt = db->aDb
11d50 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11d60 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c  f( pBt==0 || sql
11d70 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
11d80 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Bt)==0 ){.      
11d90 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73    zState = "clos
11da0 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed";.      }else
11db0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c   if( sqlite3_fil
11dc0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20  e_control(db, i 
11dd0 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62  ? db->aDb[i].zDb
11de0 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20  SName : 0, .    
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
11e20 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51  CKSTATE, &j)==SQ
11e30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11e40 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c      zState = azL
11e50 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20  ockName[j];.    
11e60 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11e70 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
11e80 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61  , 1, "ss", db->a
11e90 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  Db[i].zDbSName, 
11ea0 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20  zState);.    }. 
11eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
11ec0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
11ed0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
11ee0 2f 2a 20 50 72 61 67 6d 61 20 20 20 20 20 20 20  /* Pragma       
11ef0 20 69 41 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d   iArg.  ** -----
11f00 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20  -----   ------. 
11f10 20 2a 2a 20 20 6b 65 79 20 20 20 20 20 20 20 20   **  key        
11f20 20 20 20 30 0a 20 20 2a 2a 20 20 72 65 6b 65 79     0.  **  rekey
11f30 20 20 20 20 20 20 20 20 20 31 0a 20 20 2a 2a 20           1.  ** 
11f40 20 68 65 78 6b 65 79 20 20 20 20 20 20 20 20 32   hexkey        2
11f50 0a 20 20 2a 2a 20 20 68 65 78 72 65 6b 65 79 20  .  **  hexrekey 
11f60 20 20 20 20 20 33 0a 20 20 2a 2a 20 20 74 65 78       3.  **  tex
11f70 74 6b 65 79 20 20 20 20 20 20 20 34 0a 20 20 2a  tkey       4.  *
11f80 2a 20 20 74 65 78 74 72 65 6b 65 79 20 20 20 20  *  textrekey    
11f90 20 35 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50   5.  */.  case P
11fa0 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20  ragTyp_KEY: {.  
11fb0 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
11fc0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50        int n = pP
11fd0 72 61 67 6d 61 2d 3e 69 41 72 67 3c 34 20 3f 20  ragma->iArg<4 ? 
11fe0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11ff0 7a 52 69 67 68 74 29 20 3a 20 2d 31 3b 0a 20 20  zRight) : -1;.  
12000 20 20 20 20 69 66 28 20 28 70 50 72 61 67 6d 61      if( (pPragma
12010 2d 3e 69 41 72 67 20 26 20 31 29 3d 3d 30 20 29  ->iArg & 1)==0 )
12020 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12030 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62  3_key_v2(db, zDb
12040 2c 20 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20  , zRight, n);.  
12050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12060 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79     sqlite3_rekey
12070 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69  _v2(db, zDb, zRi
12080 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ght, n);.      }
12090 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
120a0 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61  ;.  }.  case Pra
120b0 67 54 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20  gTyp_HEXKEY: {. 
120c0 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
120d0 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b  .      u8 iByte;
120e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
120f0 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30      char zKey[40
12100 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ];.      for(i=0
12110 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a  , iByte=0; i<siz
12120 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73  eof(zKey)*2 && s
12130 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
12140 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b  Right[i]); i++){
12150 0a 20 20 20 20 20 20 20 20 69 42 79 74 65 20 3d  .        iByte =
12160 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71   (iByte<<4) + sq
12170 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52  lite3HexToInt(zR
12180 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ight[i]);.      
12190 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29    if( (i&1)!=0 )
121a0 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79   zKey[i/2] = iBy
121b0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
121c0 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e    if( (pPragma->
121d0 69 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a  iArg & 1)==0 ){.
121e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
121f0 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  key_v2(db, zDb, 
12200 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20  zKey, i/2);.    
12210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12220 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76   sqlite3_rekey_v
12230 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c  2(db, zDb, zKey,
12240 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20   i/2);.      }. 
12250 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
12260 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
12270 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
12280 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
12290 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
122a0 45 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20  E_CEROD).  case 
122b0 50 72 61 67 54 79 70 5f 41 43 54 49 56 41 54 45  PragTyp_ACTIVATE
122c0 5f 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28  _EXTENSIONS: if(
122d0 20 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65   zRight ){.#ifde
122e0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
122f0 45 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  EC.    if( sqlit
12300 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68  e3StrNICmp(zRigh
12310 74 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30  t, "see-", 4)==0
12320 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12330 33 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28 26  3_activate_see(&
12340 7a 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20  zRight[4]);.    
12350 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
12360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45  SQLITE_ENABLE_CE
12370 52 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ROD.    if( sqli
12380 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67  te3StrNICmp(zRig
12390 68 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29  ht, "cerod-", 6)
123a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
123b0 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65  ite3_activate_ce
123c0 72 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b  rod(&zRight[6]);
123d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
123e0 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
123f0 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66  f..  } /* End of
12400 20 74 68 65 20 50 52 41 47 4d 41 20 73 77 69 74   the PRAGMA swit
12410 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  ch */..  /* The 
12420 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
12430 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
12440 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
12450 73 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f  s defined. Its o
12460 6e 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65  nly.  ** purpose
12470 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 61   is to execute a
12480 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
12490 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ts to verify tha
124a0 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72  t if the.  ** Pr
124b0 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31  agFlg_NoColumns1
124c0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
124d0 20 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63   the caller spec
124e0 69 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e  ified an argumen
124f0 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52  t.  ** to the PR
12500 41 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d  AGMA, the implem
12510 65 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74  entation has not
12520 20 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65   added any OP_Re
12530 73 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e  sultRow .  ** in
12540 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68  structions to th
12550 65 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20  e VM.  */.  if( 
12560 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
12570 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43  lg & PragFlg_NoC
12580 6f 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67  olumns1) && zRig
12590 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
125a0 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73  3VdbeVerifyNoRes
125b0 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a  ultRow(v);.  }..
125c0 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71  pragma_out:.  sq
125d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
125e0 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  zLeft);.  sqlite
125f0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67  3DbFree(db, zRig
12600 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53  ht);.}.#ifndef S
12610 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12620 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  ALTABLE./*******
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12670 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ******.** Implem
12680 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65  entation of an e
12690 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
126a0 20 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73   table that runs
126b0 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f   a pragma..**.*/
126c0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
126d0 50 72 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d  PragmaVtab Pragm
126e0 61 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73  aVtab;.typedef s
126f0 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
12700 43 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61  Cursor PragmaVta
12710 62 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20  bCursor;.struct 
12720 50 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73  PragmaVtab {.  s
12730 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65  qlite3_vtab base
12740 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65  ;        /* Base
12750 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65   class.  Must be
12760 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69   first */.  sqli
12770 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
12780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
12790 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
127a0 20 74 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c   to which it bel
127b0 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ongs */.  const 
127c0 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d  PragmaName *pNam
127d0 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
127e0 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75  he pragma */.  u
127f0 38 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20  8 nHidden;      
12800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12810 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c  er of hidden col
12820 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69  umns */.  u8 iHi
12830 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  dden;           
12840 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12850 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e  the first hidden
12860 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74   column */.};.st
12870 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43  ruct PragmaVtabC
12880 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65  ursor {.  sqlite
12890 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61  3_vtab_cursor ba
128a0 73 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73  se; /* Base clas
128b0 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73  s.  Must be firs
128c0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  t */.  sqlite3_s
128d0 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  tmt *pPragma;   
128e0 20 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73   /* The pragma s
128f0 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20  tatement to run 
12900 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  */.  sqlite_int6
12910 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f  4 iRowid;      /
12920 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  * Current rowid 
12930 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67  */.  char *azArg
12940 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  [2];           /
12950 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61  * Value of the a
12960 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65  rgument and sche
12970 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  ma */.};../* .**
12980 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
12990 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f  table module xCo
129a0 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f  nnect method..*/
129b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
129c0 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20  maVtabConnect(. 
129d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
129e0 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e  void *pAux,.  in
129f0 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
12a00 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a  ar *const*argv,.
12a10 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
12a20 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20  *ppVtab,.  char 
12a30 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e  **pzErr.){.  con
12a40 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
12a50 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20  Pragma = (const 
12a60 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78  PragmaName*)pAux
12a70 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a  ;.  PragmaVtab *
12a80 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pTab = 0;.  int 
12a90 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rc;.  int i, j;.
12aa0 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28    char cSep = '(
12ab0 27 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  ';.  StrAccum ac
12ac0 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32  c;.  char zBuf[2
12ad0 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  00];..  UNUSED_P
12ae0 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
12af0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12b00 45 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69  ER(argv);.  sqli
12b10 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
12b20 26 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73  &acc, 0, zBuf, s
12b30 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b  izeof(zBuf), 0);
12b40 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
12b50 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22  ppendall(&acc, "
12b60 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 29  CREATE TABLE x")
12b70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70  ;.  for(i=0, j=p
12b80 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61  Pragma->iPragCNa
12b90 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e  me; i<pPragma->n
12ba0 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20  PragCName; i++, 
12bb0 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  j++){.    sqlite
12bc0 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61  3_str_appendf(&a
12bd0 63 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c 20  cc, "%c\"%s\"", 
12be0 63 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b  cSep, pragCName[
12bf0 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20  j]);.    cSep = 
12c00 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ',';.  }.  if( i
12c10 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
12c20 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
12c30 61 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20  acc, "(\"%s\"", 
12c40 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b  pPragma->zName);
12c50 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
12c60 6a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 72  j = 0;.  if( pPr
12c70 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26  agma->mPragFlg &
12c80 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31   PragFlg_Result1
12c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12ca0 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61  str_appendall(&a
12cb0 63 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e  cc, ",arg HIDDEN
12cc0 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  ");.    j++;.  }
12cd0 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e  .  if( pPragma->
12ce0 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67  mPragFlg & (Prag
12cf0 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72  Flg_SchemaOpt|Pr
12d00 61 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29  agFlg_SchemaReq)
12d10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12d20 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61  str_appendall(&a
12d30 63 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49 44  cc, ",schema HID
12d40 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  DEN");.    j++;.
12d50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74    }.  sqlite3_st
12d60 72 5f 61 70 70 65 6e 64 28 26 61 63 63 2c 20 22  r_append(&acc, "
12d70 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  )", 1);.  sqlite
12d80 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
12d90 26 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28  &acc);.  assert(
12da0 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20   strlen(zBuf) < 
12db0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29  sizeof(zBuf)-1 )
12dc0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12dd0 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
12de0 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72  , zBuf);.  if( r
12df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12e00 20 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67      pTab = (Prag
12e10 6d 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f  maVtab*)sqlite3_
12e20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72  malloc(sizeof(Pr
12e30 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20  agmaVtab));.    
12e40 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
12e50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12e60 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
12e70 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
12e80 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pTab, 0, sizeof(
12e90 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20  PragmaVtab));.  
12ea0 20 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20      pTab->pName 
12eb0 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20  = pPragma;.     
12ec0 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a   pTab->db = db;.
12ed0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64        pTab->iHid
12ee0 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  den = i;.      p
12ef0 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a  Tab->nHidden = j
12f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
12f10 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
12f20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
12f30 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
12f40 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20  sg(db));.  }..  
12f50 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  *ppVtab = (sqlit
12f60 65 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20  e3_vtab*)pTab;. 
12f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12f80 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
12f90 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
12fa0 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65  e xDisconnect me
12fb0 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
12fc0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69  int pragmaVtabDi
12fd0 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33  sconnect(sqlite3
12fe0 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
12ff0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
13000 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
13010 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65  )pVtab;.  sqlite
13020 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20  3_free(pTab);.  
13030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13040 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f  ;.}../* Figure o
13050 75 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ut the best inde
13060 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72  x to use to sear
13070 63 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74  ch a pragma virt
13080 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
13090 20 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72   There are not r
130a0 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20  eally any index 
130b0 63 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65  choices.  But we
130c0 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61   want to encoura
130d0 67 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  ge the.** query 
130e0 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20  planner to give 
130f0 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  == constraints o
13100 6e 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e  n as many hidden
13110 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a   parameters as.*
13120 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20  * possible, and 
13130 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68  especially on th
13140 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70  e first hidden p
13150 61 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65  arameter.  So re
13160 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63  turn a.** high c
13170 6f 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61  ost if hidden pa
13180 72 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63  rameters are unc
13190 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73  onstrained..*/.s
131a0 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
131b0 56 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71  VtabBestIndex(sq
131c0 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
131d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
131e0 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a  nfo *pIdxInfo){.
131f0 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
13200 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
13210 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  *)tab;.  const s
13220 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
13230 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
13240 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  pConstraint;.  i
13250 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73  nt i, j;.  int s
13260 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49  een[2];..  pIdxI
13270 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
13280 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  st = (double)1;.
13290 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64    if( pTab->nHid
132a0 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e  den==0 ){ return
132b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20   SQLITE_OK; }.  
132c0 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  pConstraint = pI
132d0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
132e0 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d  int;.  seen[0] =
132f0 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20   0;.  seen[1] = 
13300 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
13310 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
13320 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e  raint; i++, pCon
13330 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20  straint++){.    
13340 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
13350 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e  >usable==0 ) con
13360 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
13370 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d  Constraint->op!=
13380 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
13390 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e  STRAINT_EQ ) con
133a0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
133b0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
133c0 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64  umn < pTab->iHid
133d0 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  den ) continue;.
133e0 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61      j = pConstra
133f0 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  int->iColumn - p
13400 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20  Tab->iHidden;.  
13410 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20    assert( j < 2 
13420 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d  );.    seen[j] =
13430 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   i+1;.  }.  if( 
13440 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  seen[0]==0 ){.  
13450 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
13460 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
13470 62 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a  ble)2147483647;.
13480 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
13490 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31  timatedRows = 21
134a0 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65  47483647;.    re
134b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
134c0 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30    }.  j = seen[0
134d0 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  ]-1;.  pIdxInfo-
134e0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
134f0 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  e[j].argvIndex =
13500 20 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   1;.  pIdxInfo->
13510 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13520 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  [j].omit = 1;.  
13530 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29  if( seen[1]==0 )
13540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13550 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  K;.  pIdxInfo->e
13560 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
13570 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64  double)20;.  pId
13580 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
13590 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d  Rows = 20;.  j =
135a0 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49   seen[1]-1;.  pI
135b0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
135c0 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76  intUsage[j].argv
135d0 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64  Index = 2;.  pId
135e0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
135f0 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20  ntUsage[j].omit 
13600 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
13610 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43  LITE_OK;.}../* C
13620 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
13630 6f 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d  or for the pragm
13640 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13660 61 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c  agmaVtabOpen(sql
13670 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
13680 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
13690 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
136a0 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
136b0 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70  ursor *pCsr;.  p
136c0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
136d0 62 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33  bCursor*)sqlite3
136e0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
136f0 70 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43  pCsr));.  if( pC
13700 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  sr==0 ) return S
13710 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
13720 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
13730 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62  izeof(PragmaVtab
13740 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72  Cursor));.  pCsr
13750 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70  ->base.pVtab = p
13760 56 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f  Vtab;.  *ppCurso
13770 72 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b  r = &pCsr->base;
13780 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13790 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72  _OK;.}../* Clear
137a0 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f   all content fro
137b0 6d 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  m pragma virtual
137c0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a   table cursor. *
137d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
137e0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
137f0 65 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75  ear(PragmaVtabCu
13800 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
13810 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
13820 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70  finalize(pCsr->p
13830 50 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d  Pragma);.  pCsr-
13840 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20  >pPragma = 0;.  
13850 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
13860 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  Size(pCsr->azArg
13870 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
13880 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
13890 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70  azArg[i]);.    p
138a0 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20  Csr->azArg[i] = 
138b0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f  0;.  }.}../* Clo
138c0 73 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74  se a pragma virt
138d0 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
138e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
138f0 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73  ragmaVtabClose(s
13900 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13910 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67  or *cur){.  Prag
13920 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13930 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13940 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70  Cursor*)cur;.  p
13950 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
13960 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71  lear(pCsr);.  sq
13970 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29  lite3_free(pCsr)
13980 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13990 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61  E_OK;.}../* Adva
139a0 6e 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76  nce the pragma v
139b0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
139c0 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
139d0 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  row */.static in
139e0 74 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74  t pragmaVtabNext
139f0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
13a00 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13a10 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
13a20 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
13a30 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13a40 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
13a50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13a60 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  _OK;..  /* Incre
13a70 6d 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20  ment the xRowid 
13a80 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d  value */.  pCsr-
13a90 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73  >iRowid++;.  ass
13aa0 65 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67  ert( pCsr->pPrag
13ab0 6d 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ma );.  if( SQLI
13ac0 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f  TE_ROW!=sqlite3_
13ad0 73 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67  step(pCsr->pPrag
13ae0 6d 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ma) ){.    rc = 
13af0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
13b00 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b  (pCsr->pPragma);
13b10 0a 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67  .    pCsr->pPrag
13b20 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67  ma = 0;.    prag
13b30 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13b40 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72  r(pCsr);.  }.  r
13b50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
13b60 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
13b70 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
13b80 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a  xFilter method..
13b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13ba0 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a  agmaVtabFilter(.
13bb0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
13bc0 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
13bd0 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
13be0 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
13bf0 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
13c00 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
13c10 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61   **argv.){.  Pra
13c20 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13c30 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13c40 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
13c50 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74  rsor;.  PragmaVt
13c60 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
13c70 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75  maVtab*)(pVtabCu
13c80 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20  rsor->pVtab);.  
13c90 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c  int rc;.  int i,
13ca0 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61   j;.  StrAccum a
13cb0 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  cc;.  char *zSql
13cc0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
13cd0 4d 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20  METER(idxNum);. 
13ce0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13cf0 52 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61  R(idxStr);.  pra
13d00 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13d10 61 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20  ar(pCsr);.  j = 
13d20 28 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50  (pTab->pName->mP
13d30 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
13d40 5f 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30  _Result1)!=0 ? 0
13d50 20 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   : 1;.  for(i=0;
13d60 20 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b   i<argc; i++, j+
13d70 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
13d80 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
13d90 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
13da0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
13db0 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [i]);.    assert
13dc0 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43  ( j<ArraySize(pC
13dd0 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20  sr->azArg) );.  
13de0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
13df0 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20  azArg[j]==0 );. 
13e00 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a     if( zText ){.
13e10 20 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72        pCsr->azAr
13e20 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  g[j] = sqlite3_m
13e30 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65  printf("%s", zTe
13e40 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xt);.      if( p
13e50 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30  Csr->azArg[j]==0
13e60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
13e70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13e90 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
13ea0 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30  ccumInit(&acc, 0
13eb0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62  , 0, 0, pTab->db
13ec0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
13ed0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
13ee0 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ]);.  sqlite3_st
13ef0 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63  r_appendall(&acc
13f00 2c 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20  , "PRAGMA ");.  
13f10 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  if( pCsr->azArg[
13f20 31 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  1] ){.    sqlite
13f30 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61  3_str_appendf(&a
13f40 63 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d  cc, "%Q.", pCsr-
13f50 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a  >azArg[1]);.  }.
13f60 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
13f70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70 54  pendall(&acc, pT
13f80 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65  ab->pName->zName
13f90 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61  );.  if( pCsr->a
13fa0 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73  zArg[0] ){.    s
13fb0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
13fc0 64 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20  df(&acc, "=%Q", 
13fd0 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b  pCsr->azArg[0]);
13fe0 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71  .  }.  zSql = sq
13ff0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
14000 69 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28  ish(&acc);.  if(
14010 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
14020 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
14040 72 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e  repare_v2(pTab->
14050 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
14060 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29  Csr->pPragma, 0)
14070 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
14080 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63  (zSql);.  if( rc
14090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
140a0 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45     pTab->base.zE
140b0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
140c0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
140d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61  lite3_errmsg(pTa
140e0 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74  b->db));.    ret
140f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
14100 74 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e  turn pragmaVtabN
14110 65 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29  ext(pVtabCursor)
14120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d  ;.}../*.** Pragm
14130 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
14140 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68  module xEof meth
14150 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
14160 74 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28  t pragmaVtabEof(
14170 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
14180 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
14190 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
141a0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
141b0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
141c0 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
141d0 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50  return (pCsr->pP
141e0 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  ragma==0);.}../*
141f0 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74   The xColumn met
14200 68 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72  hod simply retur
14210 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ns the correspon
14220 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ding column from
14230 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20  .** the PRAGMA. 
14240 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
14250 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e  pragmaVtabColumn
14260 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
14270 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
14280 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33  rsor, .  sqlite3
14290 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a  _context *ctx, .
142a0 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61    int i.){.  Pra
142b0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
142c0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
142d0 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
142e0 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74  rsor;.  PragmaVt
142f0 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
14300 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75  maVtab*)(pVtabCu
14310 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20  rsor->pVtab);.  
14320 69 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64  if( i<pTab->iHid
14330 64 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  den ){.    sqlit
14340 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
14350 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ctx, sqlite3_col
14360 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e  umn_value(pCsr->
14370 70 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20  pPragma, i));.  
14380 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14390 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
143a0 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  tx, pCsr->azArg[
143b0 69 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d  i-pTab->iHidden]
143c0 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
143d0 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74  IENT);.  }.  ret
143e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
143f0 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20  ../* .** Pragma 
14400 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
14410 64 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68  dule xRowid meth
14420 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
14430 74 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69  t pragmaVtabRowi
14440 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
14450 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
14460 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  or, sqlite_int64
14470 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74   *p){.  PragmaVt
14480 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
14490 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
144a0 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
144b0 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52  .  *p = pCsr->iR
144c0 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  owid;.  return S
144d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
144e0 54 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75  The pragma virtu
144f0 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  al table object 
14500 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
14510 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70  sqlite3_module p
14520 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20  ragmaVtabModule 
14530 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14550 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
14560 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72   /* xCreate - cr
14590 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a  eate a table */.
145a0 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e    pragmaVtabConn
145b0 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ect,           /
145c0 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e  * xConnect - con
145d0 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74  nect to an exist
145e0 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ing table */.  p
145f0 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64  ragmaVtabBestInd
14600 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ex,         /* x
14610 42 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65  BestIndex - Dete
14620 72 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72  rmine search str
14630 61 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d  ategy */.  pragm
14640 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c  aVtabDisconnect,
14650 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
14660 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e  onnect - Disconn
14670 65 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  ect from a table
14680 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d     /* xDestroy -
146b0 20 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f   Drop a table */
146c0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65  .  pragmaVtabOpe
146d0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
146e0 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20  /* xOpen - open 
146f0 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72  a cursor */.  pr
14700 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20  agmaVtabClose,  
14710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
14720 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
14730 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
14740 61 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20  aVtabFilter,    
14750 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
14760 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
14770 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
14780 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e  */.  pragmaVtabN
14790 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
147a0 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
147b0 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
147c0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66  .  pragmaVtabEof
147d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
147e0 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61  /* xEof */.  pra
147f0 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20  gmaVtabColumn,  
14800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
14810 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
14820 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
14830 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
14840 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72     /* xRowid - r
14850 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c  ead data */.  0,
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
14880 70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61  pdate - write da
14890 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d       /* xBegin -
148c0 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
148d0 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20       /* xSync - 
14900 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e  sync transaction
14910 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20     /* xCommit - 
14940 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69  commit transacti
14950 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
14980 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61  k - rollback tra
14990 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
149c0 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75  indFunction - fu
149d0 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
149e0 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ng */.  0,      
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
14a10 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62  - rename the tab
14a20 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  le */.  0,      
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69       /* xSavepoi
14a50 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nt */.  0,      
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65       /* xRelease
14a80 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54     /* xRollbackT
14ab0 6f 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  o */.  0        
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61      /* xShadowNa
14ae0 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  me */.};../*.** 
14af0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
14b00 7a 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c  zTabName is real
14b10 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ly the name of a
14b20 20 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20   pragma.  If it 
14b30 69 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69  is,.** then regi
14b40 73 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  ster an eponymou
14b50 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
14b60 66 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61 20  for that pragma 
14b70 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  and return.** a 
14b80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
14b90 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72  odule object for
14ba0 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c   the new virtual
14bb0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c   table..*/.Modul
14bc0 65 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61  e *sqlite3Pragma
14bd0 56 74 61 62 52 65 67 69 73 74 65 72 28 73 71 6c  VtabRegister(sql
14be0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
14bf0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
14c00 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
14c10 20 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72   *pName;.  asser
14c20 74 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  t( sqlite3_strni
14c30 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
14c40 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20  ma_", 7)==0 );. 
14c50 20 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c   pName = pragmaL
14c60 6f 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a  ocate(zName+7);.
14c70 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29    if( pName==0 )
14c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
14c90 20 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c   (pName->mPragFl
14ca0 67 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73  g & (PragFlg_Res
14cb0 75 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73  ult0|PragFlg_Res
14cc0 75 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75  ult1))==0 ) retu
14cd0 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
14ce0 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
14cf0 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e  &db->aModule, zN
14d00 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ame)==0 );.  ret
14d10 75 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43  urn sqlite3VtabC
14d20 72 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20  reateModule(db, 
14d30 7a 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74  zName, &pragmaVt
14d40 61 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a  abModule, (void*
14d50 29 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23  )pName, 0);.}..#
14d60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14d70 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14d80 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  E */..#endif /* 
14d90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47  SQLITE_OMIT_PRAG
14da0 4d 41 20 2a 2f 0a                                MA */.