/ Hex Artifact Content
Login

Artifact de5462b81eb208cfad2995f77f9909cb0758e026e8f7700727489a17324d30f3:


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 74 68  sult row with th
23e0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c 64  e result.** held
23f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67   in register reg
2400: 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d 65  Result.  Decreme
2410: 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  nt the result co
2420: 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66 0a  unt and halt if.
2430: 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
2440: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
2450: 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 69  rows have been i
2460: 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssued..*/.static
2470: 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43 68   int integrityCh
2480: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64 62  eckResultRow(Vdb
2490: 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65 73  e *v, int regRes
24a0: 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ult){.  int addr
24b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
24c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
24d0: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
24e0: 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  , 1);.  addr = s
24f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2500: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 2c  (v, OP_IfPos, 1,
2510: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2520: 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31 29  entAddr(v)+2, 1)
2530: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
2540: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
2550: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48  beAddOp2(v, OP_H
2560: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  alt, 0, 0);.  re
2570: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2580: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72  .** Process a pr
2590: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
25a0: 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20   .**.** Pragmas 
25b0: 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d  are of this form
25c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41  :.**.**      PRA
25d0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20  GMA [schema.]id 
25e0: 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20  [= value].**.** 
25f0: 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d  The identifier m
2600: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73  ight also be a s
2610: 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75  tring.  The valu
2620: 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61  e is a string, a
2630: 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  nd.** identifier
2640: 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20  , or a number.  
2650: 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20  If minusFlag is 
2660: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76  true, then the v
2670: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d  alue is.** a num
2680: 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65  ber that was pre
2690: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
26a0: 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   sign..**.** If 
26b0: 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69 73  the left side is
26c0: 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20 74   "database.id" t
26d0: 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65 20  hen pId1 is the 
26e0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a  database name.**
26f0: 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68 65   and pId2 is the
2700: 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65 66   id.  If the lef
2710: 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20 22  t side is just "
2720: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
2730: 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20 70   the.** id and p
2740: 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74 79  Id2 is any empty
2750: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64   string..*/.void
2760: 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 0a   sqlite3Pragma(.
2770: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2780: 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31 2c   .  Token *pId1,
2790: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
27a0: 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61   part of [schema
27b0: 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20  .]id field */.  
27c0: 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20 20  Token *pId2,    
27d0: 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
27e0: 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d 69  rt of [schema.]i
27f0: 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c 4c  d field, or NULL
2800: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56 61   */.  Token *pVa
2810: 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f 6b  lue,      /* Tok
2820: 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c 20  en for <value>, 
2830: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
2840: 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20 20   minusFlag      
2850: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27 2d   /* True if a '-
2860: 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64 20  ' sign preceded 
2870: 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20 20  <value> */.){.  
2880: 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b  char *zLeft = 0;
2890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
28a0: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73  rminated UTF-8 s
28b0: 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20 20  tring <id> */.  
28c0: 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30  char *zRight = 0
28d0: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65  ;      /* Nul-te
28e0: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73  rminated UTF-8 s
28f0: 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20 6f  tring <value>, o
2900: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
2910: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b  t char *zDb = 0;
2920: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
2930: 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b  se name */.  Tok
2940: 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20  en *pId;        
2950: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2960: 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f 0a  o <id> token */.
2970: 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b 34    char *aFcntl[4
2980: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75  ];       /* Argu
2990: 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f 46  ment to SQLITE_F
29a0: 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20  CNTL_PRAGMA */. 
29b0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
29d0: 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c 64  ase index for <d
29e0: 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69 6e  atabase> */.  in
29f0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65             /* re
2a10: 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d 20  turn value form 
2a20: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2a30: 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  GMA */.  sqlite3
2a40: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2a50: 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  b;    /* The dat
2a60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2a70: 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20   */.  Db *pDb;  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
2aa0: 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  ic database bein
2ab0: 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20 20  g pragmaed */.  
2ac0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
2ad0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2ae0: 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73  ;  /* Prepared s
2af0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
2b00: 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
2b10: 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54 68  pPragma;   /* Th
2b20: 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20 69  e pragma */..  i
2b30: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
2b40: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
2b50: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a 20  unOnlyOnce(v);. 
2b60: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
2b70: 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70 72  2;..  /* Interpr
2b80: 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e 5d  et the [schema.]
2b90: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61   part of the pra
2ba0: 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 69  gma statement. i
2bb0: 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 69  Db is the.  ** i
2bc0: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
2bd0: 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d 61  base this pragma
2be0: 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69 65   is being applie
2bf0: 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b 5d  d to in db.aDb[]
2c00: 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c  . */.  iDb = sql
2c10: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
2c20: 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70 49  pParse, pId1, pI
2c30: 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66 28  d2, &pId);.  if(
2c40: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
2c50: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
2c60: 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49 66  b[iDb];..  /* If
2c70: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
2c80: 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  se has been expl
2c90: 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73 20  icitly named as 
2ca0: 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20 2a  part of the .  *
2cb0: 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20 73  * pragma, make s
2cc0: 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e 20  ure it is open. 
2cd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62 3d  .  */.  if( iDb=
2ce0: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70 65  =1 && sqlite3Ope
2cf0: 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
2d00: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
2d10: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65 66  urn;.  }..  zLef
2d20: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2d30: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49 64  romToken(db, pId
2d40: 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74 20  );.  if( !zLeft 
2d50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2d60: 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20  minusFlag ){.   
2d70: 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   zRight = sqlite
2d80: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d 25  3MPrintf(db, "-%
2d90: 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d  T", pValue);.  }
2da0: 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74  else{.    zRight
2db0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
2dc0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61 6c  omToken(db, pVal
2dd0: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ue);.  }..  asse
2de0: 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a 44  rt( pId2 );.  zD
2df0: 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f 20  b = pId2->n>0 ? 
2e00: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a 20  pDb->zDbSName : 
2e10: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
2e20: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
2e30: 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 2c  , SQLITE_PRAGMA,
2e40: 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c 20   zLeft, zRight, 
2e50: 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  zDb) ){.    goto
2e60: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d   pragma_out;.  }
2e70: 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20 53  ..  /* Send an S
2e80: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47  QLITE_FCNTL_PRAG
2e90: 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  MA file-control 
2ea0: 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
2eb0: 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e 65  g VFS.  ** conne
2ec0: 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72 65  ction.  If it re
2ed0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2c  turns SQLITE_OK,
2ee0: 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 61   then assume tha
2ef0: 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20 68  t the VFS.  ** h
2f00: 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67 6d  andled the pragm
2f10: 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61  a and generate a
2f20: 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64 20   no-op prepared 
2f30: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a 0a  statement..  **.
2f40: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
2f50: 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38 2d  ION-OF: R-12238-
2f60: 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20 61  55120 Whenever a
2f70: 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65 6e   PRAGMA statemen
2f80: 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20 2a  t is parsed,.  *
2f90: 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54  * an SQLITE_FCNT
2fa0: 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63 6f  L_PRAGMA file co
2fb0: 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74 6f  ntrol is sent to
2fc0: 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74 65   the open sqlite
2fd0: 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a 65  3_file.  ** obje
2fe0: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
2ff0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
3000: 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20 74   file to which t
3010: 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20 73  he pragma.  ** s
3020: 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73 2e  tatement refers.
3030: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
3040: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
3050: 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65 20  29875-31678 The 
3060: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3070: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
3080: 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63 6f  GMA.  ** file co
3090: 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72 61  ntrol is an arra
30a0: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
30b0: 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a 2a   strings (char**
30c0: 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a 20  ) in which the. 
30d0: 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65   ** second eleme
30e0: 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  nt of the array 
30f0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
3100: 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74 68  he pragma and th
3110: 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c 65  e third.  ** ele
3120: 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67 75  ment is the argu
3130: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61 67  ment to the prag
3140: 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ma or NULL if th
3150: 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f 0a  e pragma has no.
3160: 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 20    ** argument.. 
3170: 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d 20   */.  aFcntl[0] 
3180: 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31 5d  = 0;.  aFcntl[1]
3190: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63 6e   = zLeft;.  aFcn
31a0: 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b 0a  tl[2] = zRight;.
31b0: 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30 3b    aFcntl[3] = 0;
31c0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
31d0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
31e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
31f0: 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
3200: 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
3210: 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29 61  PRAGMA, (void*)a
3220: 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72 63  Fcntl);.  if( rc
3230: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
3250: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a  tNumCols(v, 1);.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
3280: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61 46  COLNAME_NAME, aF
3290: 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45 5f  cntl[0], SQLITE_
32a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
32b0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
32c0: 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a  (v, aFcntl[0]);.
32d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32e0: 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20  (aFcntl[0]);.   
32f0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
3300: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
3310: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
3320: 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e 74  ){.    if( aFcnt
3330: 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  l[0] ){.      sq
3340: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3350: 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63 6e  arse, "%s", aFcn
3360: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71  tl[0]);.      sq
3370: 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e 74  lite3_free(aFcnt
3380: 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l[0]);.    }.   
3390: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
33a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
33b0: 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 70  = rc;.    goto p
33c0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
33d0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
33e0: 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c 6f  pragma in the lo
33f0: 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  okup table */.  
3400: 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d 61  pPragma = pragma
3410: 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a 20  Locate(zLeft);. 
3420: 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30 20   if( pPragma==0 
3430: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
3440: 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
3450: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
3460: 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64  schema is loaded
3470: 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 72   if the pragma r
3480: 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f 0a  equires that */.
3490: 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e    if( (pPragma->
34a0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
34b0: 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21 3d  lg_NeedSchema)!=
34c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
34d0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
34e0: 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72  Parse) ) goto pr
34f0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  agma_out;.  }.. 
3500: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65   /* Register the
3510: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
3520: 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61 73  ames for pragmas
3530: 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65 73   that return res
3540: 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28 70  ults */.  if( (p
3550: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
3560: 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
3570: 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26 20  umns)==0 .   && 
3580: 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67  ((pPragma->mPrag
3590: 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f  Flg & PragFlg_No
35a0: 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20  Columns1)==0 || 
35b0: 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a  zRight==0).  ){.
35c0: 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65 73      setPragmaRes
35d0: 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76  ultColumnNames(v
35e0: 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a  , pPragma);.  }.
35f0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
3600: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 72  e appropriate pr
3610: 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a  agma handler */.
3620: 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67 6d    switch( pPragm
3630: 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a 20  a->ePragTyp ){. 
3640: 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
3650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
3660: 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64 65  _PRAGMAS) && !de
3670: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3680: 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20 20  T_DEPRECATED).  
3690: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
36a0: 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74  [schema.]default
36b0: 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  _cache_size.  **
36c0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
36d0: 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f  .]default_cache_
36e0: 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  size=N.  **.  **
36f0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
3700: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
3710: 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20 73  ent persistent s
3720: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
3730: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
3740: 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ize.  The value 
3750: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
3760: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
3770: 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20  f.  ** pages in 
3780: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
3790: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
37a0: 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20 63   sets both the c
37b0: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65  urrent.  ** page
37c0: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
37d0: 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69 73  e and the persis
37e0: 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20  tent page cache 
37f0: 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  size value.  ** 
3800: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
3810: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
3820: 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72  *.  ** Older ver
3830: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
3840: 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64 65  would set the de
3850: 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65  fault cache size
3860: 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74   to a.  ** negat
3870: 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e  ive number to in
3880: 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f  dicate synchrono
3890: 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20 64  us=OFF.  These d
38a0: 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73  ays, synchronous
38b0: 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  .  ** is always 
38c0: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72 65  on by default re
38d0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
38e0: 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66 61  sign of the defa
38f0: 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73  ult cache.  ** s
3900: 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e  ize.  But contin
3910: 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 61  ue to take the a
3920: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
3930: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63   the default cac
3940: 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  he.  ** size of 
3950: 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
3960: 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20  tibility..  */. 
3970: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 45   case PragTyp_DE
3980: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3990: 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
39a0: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
39b0: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
39c0: 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63  O(2);.    static
39d0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
39e0: 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d  t getCacheSize[]
39f0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
3a00: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20  Transaction, 0, 
3a10: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  0,        0},   
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20        /* 0 */.  
3a40: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
3a50: 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20 20  kie,  0, 1,     
3a60: 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54     BTREE_DEFAULT
3a70: 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f  _CACHE_SIZE},  /
3a80: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
3a90: 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31  P_IfPos,       1
3aa0: 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 8,        0},.
3ab0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
3ac0: 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  er,     0, 2,   
3ad0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
3ae0: 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20 20   OP_Subtract,   
3af0: 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31 7d   1, 2,        1}
3b00: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50  ,.      { OP_IfP
3b10: 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20  os,       1, 8, 
3b20: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
3b30: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
3b40: 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20     0, 1,        
3b50: 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  0},             
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36              /* 6
3b70: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
3b80: 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30  oop,        0, 0
3b90: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3ba0: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
3bb0: 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  w,   1, 1,      
3bc0: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
3bd0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20   VdbeOp *aOp;.  
3be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
3bf0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
3c00: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
3c10: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
3c20: 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20  >nMem += 2;.    
3c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72    sqlite3VdbeVer
3c40: 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69  ifyNoMallocRequi
3c50: 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65  red(v, ArraySize
3c60: 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29 3b  (getCacheSize));
3c70: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
3c80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3c90: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
3ca0: 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65  etCacheSize), ge
3cb0: 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29  tCacheSize, iLn)
3cc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59  ;.      if( ONLY
3cd0: 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  _IF_REALLOC_STRE
3ce0: 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65  SS(aOp==0) ) bre
3cf0: 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d  ak;.      aOp[0]
3d00: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
3d10: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
3d20: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70  ;.      aOp[6].p
3d30: 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  1 = SQLITE_DEFAU
3d40: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20  LT_CACHE_SIZE;. 
3d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d60: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
3d70: 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74  e3AbsInt32(sqlit
3d80: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b  e3Atoi(zRight));
3d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
3da0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
3db0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
3dc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3dd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3de0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
3df0: 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43   BTREE_DEFAULT_C
3e00: 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29  ACHE_SIZE, size)
3e10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3e20: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3e30: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3e40: 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  0) );.      pDb-
3e50: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
3e60: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  size = size;.   
3e70: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
3e80: 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d  etCacheSize(pDb-
3e90: 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65  >pBt, pDb->pSche
3ea0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  ma->cache_size);
3eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
3ec0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
3ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  !SQLITE_OMIT_PAG
3ee0: 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21 53  ER_PRAGMAS && !S
3ef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
3f00: 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64  CATED */..#if !d
3f10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3f20: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
3f30: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
3f40: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67  GMA [schema.]pag
3f50: 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  e_size.  **  PRA
3f60: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67  GMA [schema.]pag
3f70: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
3f80: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
3f90: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
3fa0: 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  rrent setting fo
3fb0: 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  r the.  ** datab
3fc0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ase page size in
3fd0: 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65 63   bytes.  The sec
3fe0: 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68  ond form sets th
3ff0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
4000: 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65 2e  page size value.
4010: 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e 20    The value can 
4020: 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a 20  only be set if. 
4030: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
4040: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
4050: 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a  n created..  */.
4060: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50    case PragTyp_P
4070: 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  AGE_SIZE: {.    
4080: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62  Btree *pBt = pDb
4090: 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
40a0: 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20  t( pBt!=0 );.   
40b0: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
40c0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
40d0: 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20 73   ALWAYS(pBt) ? s
40e0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
40f0: 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30 3b  geSize(pBt) : 0;
4100: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
4110: 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b  gleInt(v, size);
4120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4130: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20    /* Malloc may 
4140: 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69 6e  fail when settin
4150: 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  g the page-size,
4160: 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e 20   as there is an 
4170: 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a  internal.      *
4180: 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74 68  * buffer that th
4190: 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 72  e pager module r
41a0: 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71 6c  esizes using sql
41b0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a  ite3_realloc()..
41c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
41d0: 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20  b->nextPagesize 
41e0: 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  = sqlite3Atoi(zR
41f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
4200: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
4210: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
4220: 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
4230: 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c  nextPagesize,-1,
4240: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
4250: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
4260: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4270: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4280: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4290: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75  MA [schema.]secu
42a0: 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20  re_delete.  **  
42b0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
42c0: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e  secure_delete=ON
42d0: 2f 4f 46 46 2f 46 41 53 54 0a 20 20 2a 2a 0a 20  /OFF/FAST.  **. 
42e0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
42f0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
4300: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
4310: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 65 63 75  or the.  ** secu
4320: 72 65 5f 64 65 6c 65 74 65 20 66 6c 61 67 2e 20  re_delete flag. 
4330: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
4340: 20 63 68 61 6e 67 65 73 20 74 68 65 20 73 65 63   changes the sec
4350: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
4360: 66 6c 61 67 20 73 65 74 74 69 6e 67 20 61 6e 64  flag setting and
4370: 20 72 65 70 6f 72 74 73 20 74 68 65 20 6e 65 77   reports the new
4380: 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 63   value..  */.  c
4390: 61 73 65 20 50 72 61 67 54 79 70 5f 53 45 43 55  ase PragTyp_SECU
43a0: 52 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20  RE_DELETE: {.   
43b0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
43c0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 69 6e 74 20  b->pBt;.    int 
43d0: 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  b = -1;.    asse
43e0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
43f0: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
4400: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4410: 33 5f 73 74 72 69 63 6d 70 28 7a 52 69 67 68 74  3_stricmp(zRight
4420: 2c 20 22 66 61 73 74 22 29 3d 3d 30 20 29 7b 0a  , "fast")==0 ){.
4430: 20 20 20 20 20 20 20 20 62 20 3d 20 32 3b 0a 20          b = 2;. 
4440: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4450: 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33 47      b = sqlite3G
4460: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
4470: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
4480: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 32    }.    if( pId2
4490: 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29  ->n==0 && b>=0 )
44a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
44b0: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
44c0: 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
44d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
44e0: 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
44f0: 65 74 65 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  ete(db->aDb[ii].
4500: 70 42 74 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d  pBt, b);.      }
4510: 0a 20 20 20 20 7d 0a 20 20 20 20 62 20 3d 20 73  .    }.    b = s
4520: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
4530: 65 44 65 6c 65 74 65 28 70 42 74 2c 20 62 29 3b  eDelete(pBt, b);
4540: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
4550: 65 49 6e 74 28 76 2c 20 62 29 3b 0a 20 20 20 20  eInt(v, b);.    
4560: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
4570: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
4580: 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f  chema.]max_page_
4590: 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50 52 41 47  count.  **  PRAG
45a0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
45b0: 70 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20 2a  page_count=N.  *
45c0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
45d0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
45e0: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
45f0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  g for the.  ** m
4600: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
4610: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
4620: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
4630: 65 20 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20 66  e .  ** second f
4640: 6f 72 6d 20 61 74 74 65 6d 70 74 73 20 74 6f 20  orm attempts to 
4650: 63 68 61 6e 67 65 20 74 68 69 73 20 73 65 74 74  change this sett
4660: 69 6e 67 2e 20 20 42 6f 74 68 0a 20 20 2a 2a 20  ing.  Both.  ** 
4670: 66 6f 72 6d 73 20 72 65 74 75 72 6e 20 74 68 65  forms return the
4680: 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
4690: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
46a0: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
46b0: 66 20 4e 20 69 73 20 75 73 65 64 2e 20 20 54 68  f N is used.  Th
46c0: 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  is is undocument
46d0: 65 64 20 61 6e 64 20 6d 69 67 68 74 0a 20 20 2a  ed and might.  *
46e0: 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 6f  * change.  The o
46f0: 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 20 74  nly purpose is t
4700: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 61 73  o provide an eas
4710: 79 20 77 61 79 20 74 6f 20 74 65 73 74 0a 20 20  y way to test.  
4720: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 41 62  ** the sqlite3Ab
4730: 73 49 6e 74 33 32 28 29 20 66 75 6e 63 74 69 6f  sInt32() functio
4740: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 50 52  n..  **.  **  PR
4750: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
4760: 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20  ge_count.  **.  
4770: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
4780: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4790: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
47a0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
47b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 47  case PragTyp_PAG
47c0: 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 69  E_COUNT: {.    i
47d0: 6e 74 20 69 52 65 67 3b 0a 20 20 20 20 73 71 6c  nt iReg;.    sql
47e0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
47f0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
4800: 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 2b 2b  );.    iReg = ++
4810: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
4820: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 6f 6c    if( sqlite3Tol
4830: 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d  ower(zLeft[0])==
4840: 27 70 27 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  'p' ){.      sql
4850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4860: 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 2c 20  , OP_Pagecount, 
4870: 69 44 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  iDb, iReg);.    
4880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
4890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
48a0: 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74 2c 20 69  , OP_MaxPgcnt, i
48b0: 44 62 2c 20 69 52 65 67 2c 20 0a 20 20 20 20 20  Db, iReg, .     
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48d0: 20 20 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74     sqlite3AbsInt
48e0: 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  32(sqlite3Atoi(z
48f0: 52 69 67 68 74 29 29 29 3b 0a 20 20 20 20 7d 0a  Right)));.    }.
4900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4910: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
4920: 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20 31 29 3b  ltRow, iReg, 1);
4930: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4940: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4950: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
4960: 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50  ing_mode.  **  P
4970: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c  RAGMA [schema.]l
4980: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 28 6e  ocking_mode = (n
4990: 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69 76 65 29  ormal|exclusive)
49a0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
49b0: 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  gTyp_LOCKING_MOD
49c0: 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  E: {.    const c
49d0: 68 61 72 20 2a 7a 52 65 74 20 3d 20 22 6e 6f 72  har *zRet = "nor
49e0: 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74 20 65 4d  mal";.    int eM
49f0: 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b 69 6e 67  ode = getLocking
4a00: 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b 0a 0a 20  Mode(zRight);.. 
4a10: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
4a20: 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45  0 && eMode==PAGE
4a30: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
4a40: 45 52 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ERY ){.      /* 
4a50: 53 69 6d 70 6c 65 20 22 50 52 41 47 4d 41 20 6c  Simple "PRAGMA l
4a60: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22 20 73 74  ocking_mode;" st
4a70: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
4a80: 20 61 20 71 75 65 72 79 20 66 6f 72 0a 20 20 20   a query for.   
4a90: 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
4aa0: 74 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  t default lockin
4ab0: 67 20 6d 6f 64 65 20 28 77 68 69 63 68 20 6d 61  g mode (which ma
4ac0: 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 74  y be different t
4ad0: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  o.      ** the l
4ae0: 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f 66 20 74  ocking-mode of t
4af0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
4b00: 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
4b10: 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d 3e 64 66    eMode = db->df
4b20: 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20 20  ltLockMode;.    
4b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61 67  }else{.      Pag
4b40: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
4b50: 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30    if( pId2->n==0
4b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
4b70: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 74 68  his indicates th
4b80: 61 74 20 6e 6f 20 64 61 74 61 62 61 73 65 20 6e  at no database n
4b90: 61 6d 65 20 77 61 73 20 73 70 65 63 69 66 69 65  ame was specifie
4ba0: 64 20 61 73 20 70 61 72 74 0a 20 20 20 20 20 20  d as part.      
4bb0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 52 41 47    ** of the PRAG
4bc0: 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74  MA command. In t
4bd0: 68 69 73 20 63 61 73 65 20 74 68 65 20 6c 6f 63  his case the loc
4be0: 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73 74 20 62  king-mode must b
4bf0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  e.        ** set
4c00: 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   on all attached
4c10: 20 64 61 74 61 62 61 73 65 73 2c 20 61 73 20 77   databases, as w
4c20: 65 6c 6c 20 61 73 20 74 68 65 20 6d 61 69 6e 20  ell as the main 
4c30: 64 62 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  db file..       
4c40: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
4c50: 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69 74 65 33  lso, the sqlite3
4c60: 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76 61  .dfltLockMode va
4c70: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 73 6f  riable is set so
4c80: 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
4c90: 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74 6c   any subsequentl
4ca0: 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  y attached datab
4cb0: 61 73 65 73 20 61 6c 73 6f 20 75 73 65 20 74 68  ases also use th
4cc0: 65 20 73 70 65 63 69 66 69 65 64 0a 20 20 20 20  e specified.    
4cd0: 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 6d      ** locking m
4ce0: 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ode..        */.
4cf0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
4d00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
4d10: 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b 30 5d 29  Db==&db->aDb[0])
4d20: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
4d30: 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =2; ii<db->nDb; 
4d40: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
4d50: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
4d60: 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
4d70: 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b 0a 20 20  aDb[ii].pBt);.  
4d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
4d90: 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
4da0: 70 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a  pPager, eMode);.
4db0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4dc0: 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
4dd0: 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a  de = (u8)eMode;.
4de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
4df0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
4e00: 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42  reePager(pDb->pB
4e10: 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f 64 65 20  t);.      eMode 
4e20: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
4e30: 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67 65 72  ckingMode(pPager
4e40: 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  , eMode);.    }.
4e50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f  .    assert( eMo
4e60: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
4e70: 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
4e80: 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
4e90: 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
4ea0: 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
4eb0: 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  ;.    if( eMode=
4ec0: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4ed0: 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  DE_EXCLUSIVE ){.
4ee0: 20 20 20 20 20 20 7a 52 65 74 20 3d 20 22 65 78        zRet = "ex
4ef0: 63 6c 75 73 69 76 65 22 3b 0a 20 20 20 20 7d 0a  clusive";.    }.
4f00: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
4f10: 54 65 78 74 28 76 2c 20 7a 52 65 74 29 3b 0a 20  Text(v, zRet);. 
4f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
4f30: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
4f40: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
4f50: 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41  l_mode.  **  PRA
4f60: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75  GMA [schema.]jou
4f70: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a 2a  rnal_mode =.  **
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 20 20 28 64 65 6c 65 74 65 7c 70 65        (delete|pe
4fa0: 72 73 69 73 74 7c 6f 66 66 7c 74 72 75 6e 63 61  rsist|off|trunca
4fb0: 74 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f 66  te|memory|wal|of
4fc0: 66 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  f).  */.  case P
4fd0: 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 4d  ragTyp_JOURNAL_M
4fe0: 4f 44 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65  ODE: {.    int e
4ff0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Mode;        /* 
5000: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
5010: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58  _JOURNALMODE_XXX
5020: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20 20   symbols */.    
5030: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
5040: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
5050: 72 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52  r */..    if( zR
5060: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
5070: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
5080: 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  no "=MODE" part 
5090: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 2c 20 64  of the pragma, d
50a0: 6f 20 61 20 71 75 65 72 79 20 66 6f 72 20 74 68  o a query for th
50b0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  e.      ** curre
50c0: 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20  nt mode */.     
50d0: 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a   eMode = PAGER_J
50e0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
50f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5100: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5110: 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Mode;.      int 
5120: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5130: 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  n30(zRight);.   
5140: 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30 3b 20     for(eMode=0; 
5150: 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  (zMode = sqlite3
5160: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28  JournalModename(
5170: 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d 6f 64  eMode))!=0; eMod
5180: 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  e++){.        if
5190: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
51a0: 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64 65 2c  p(zRight, zMode,
51b0: 20 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   n)==0 ) break;.
51c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
51d0: 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20 20 20  ( !zMode ){.    
51e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 22 3d      /* If the "=
51f0: 4d 4f 44 45 22 20 70 61 72 74 20 64 6f 65 73 20  MODE" part does 
5200: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 6b 6e  not match any kn
5210: 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  own journal mode
5220: 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
5230: 6e 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a  n do a query */.
5240: 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
5250: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
5260: 45 5f 51 55 45 52 59 3b 0a 20 20 20 20 20 20 7d  E_QUERY;.      }
5270: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
5280: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
5290: 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 26 26  NALMODE_QUERY &&
52a0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pId2->n==0 ){. 
52b0: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
52c0: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
52d0: 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50 52 41 47  mode" into "PRAG
52e0: 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f  MA main.journal_
52f0: 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20 20 69  mode" */.      i
5300: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  Db = 0;.      pI
5310: 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  d2->n = 1;.    }
5320: 0a 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e  .    for(ii=db->
5330: 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69  nDb-1; ii>=0; ii
5340: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  --){.      if( d
5350: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26  b->aDb[ii].pBt &
5360: 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49  & (ii==iDb || pI
5370: 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  d2->n==0) ){.   
5380: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5390: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 69 29  UsesBtree(v, ii)
53a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
53b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
53c0: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20 69  P_JournalMode, i
53d0: 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  i, 1, eMode);.  
53e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
53f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5400: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
5410: 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 62 72  w, 1, 1);.    br
5420: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
5430: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5440: 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a  ema.]journal_siz
5450: 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52  e_limit.  **  PR
5460: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
5470: 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74  urnal_size_limit
5480: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74  =N.  **.  ** Get
5490: 20 6f 72 20 73 65 74 20 74 68 65 20 73 69 7a 65   or set the size
54a0: 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61   limit on rollba
54b0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ck journal files
54c0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
54d0: 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49  agTyp_JOURNAL_SI
54e0: 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20  ZE_LIMIT: {.    
54f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5500: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
5510: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
5520: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32   i64 iLimit = -2
5530: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
5540: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5550: 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
5560: 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b  Right, &iLimit);
5570: 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69  .      if( iLimi
5580: 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20 3d 20  t<-1 ) iLimit = 
5590: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  -1;.    }.    iL
55a0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61  imit = sqlite3Pa
55b0: 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  gerJournalSizeLi
55c0: 6d 69 74 28 70 50 61 67 65 72 2c 20 69 4c 69 6d  mit(pPager, iLim
55d0: 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53  it);.    returnS
55e0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d  ingleInt(v, iLim
55f0: 69 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  it);.    break;.
5600: 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53    }..#endif /* S
5610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
5620: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f  _PRAGMAS */..  /
5630: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
5640: 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63  schema.]auto_vac
5650: 75 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  uum.  **  PRAGMA
5660: 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76   [schema.]auto_v
5670: 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  acuum=N.  **.  *
5680: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
5690: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
56a0: 74 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61 63  tabase 'auto-vac
56b0: 75 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e 0a  uum' parameter..
56c0: 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
56d0: 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e  s one of:  0 NON
56e0: 45 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52 45  E 1 FULL 2 INCRE
56f0: 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e  MENTAL.  */.#ifn
5700: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5710: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61 73  AUTOVACUUM.  cas
5720: 65 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f 56  e PragTyp_AUTO_V
5730: 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72  ACUUM: {.    Btr
5740: 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70  ee *pBt = pDb->p
5750: 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
5760: 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  pBt!=0 );.    if
5770: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
5780: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
5790: 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 42 74 72  nt(v, sqlite3Btr
57a0: 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
57b0: 70 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pBt));.    }else
57c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 41 75 74  {.      int eAut
57d0: 6f 20 3d 20 67 65 74 41 75 74 6f 56 61 63 75 75  o = getAutoVacuu
57e0: 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  m(zRight);.     
57f0: 20 61 73 73 65 72 74 28 20 65 41 75 74 6f 3e 3d   assert( eAuto>=
5800: 30 20 26 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b  0 && eAuto<=2 );
5810: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 41  .      db->nextA
5820: 75 74 6f 76 61 63 20 3d 20 28 75 38 29 65 41 75  utovac = (u8)eAu
5830: 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c  to;.      /* Cal
5840: 6c 20 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  l SetAutoVacuum(
5850: 29 20 74 6f 20 73 65 74 20 69 6e 69 74 69 61 6c  ) to set initial
5860: 69 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ize the internal
5870: 20 61 75 74 6f 20 61 6e 64 0a 20 20 20 20 20 20   auto and.      
5880: 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 66  ** incr-vacuum f
5890: 6c 61 67 73 2e 20 54 68 69 73 20 69 73 20 72 65  lags. This is re
58a0: 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74  quired in case t
58b0: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  his connection. 
58c0: 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73 20       ** creates 
58d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
58e0: 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  e. It is importa
58f0: 6e 74 20 74 68 61 74 20 69 74 20 69 73 20 63 72  nt that it is cr
5900: 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  eated.      ** a
5910: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
5920: 20 63 61 70 61 62 6c 65 20 64 62 2e 0a 20 20 20   capable db..   
5930: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
5940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
5950: 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 2c 20  AutoVacuum(pBt, 
5960: 65 41 75 74 6f 29 3b 0a 20 20 20 20 20 20 69 66  eAuto);.      if
5970: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5980: 26 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20  && (eAuto==1 || 
5990: 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20  eAuto==2) ){.   
59a0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 73 65 74       /* When set
59b0: 74 69 6e 67 20 74 68 65 20 61 75 74 6f 5f 76 61  ting the auto_va
59c0: 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74  cuum mode to eit
59d0: 68 65 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20  her "full" or . 
59e0: 20 20 20 20 20 20 20 2a 2a 20 22 69 6e 63 72 65         ** "incre
59f0: 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74 65 20 74  mental", write t
5a00: 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
5a10: 5b 36 5d 20 69 6e 20 74 68 65 20 64 61 74 61 62  [6] in the datab
5a20: 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ase.        ** f
5a30: 69 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69 74  ile. Before writ
5a40: 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20  ing to meta[6], 
5a50: 63 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61 5b  check that meta[
5a60: 33 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20 20  3] indicates.   
5a70: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69       ** that thi
5a80: 73 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61  s really is an a
5a90: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
5aa0: 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  le database..   
5ab0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
5ac0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
5ad0: 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53   iLn = VDBE_OFFS
5ae0: 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20  ET_LINENO(2);.  
5af0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
5b00: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65  st VdbeOpList se
5b10: 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20  tMeta6[] = {.   
5b20: 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e         { OP_Tran
5b30: 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20  saction,    0,  
5b40: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5b50: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5b60: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
5b70: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
5b80: 69 65 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20  ie,     0,      
5b90: 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 42 54     1,         BT
5ba0: 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54  REE_LARGEST_ROOT
5bb0: 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20 20 20 20  _PAGE},.        
5bc0: 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20 20    { OP_If,      
5bd0: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5be0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
5bf0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32       0},    /* 2
5c00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
5c10: 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20  OP_Halt,        
5c20: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45     SQLITE_OK, OE
5c30: 5f 41 62 6f 72 74 2c 20 20 20 20 20 20 20 20 20  _Abort,         
5c40: 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a   0},    /* 3 */.
5c50: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53            { OP_S
5c60: 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30  etCookie,      0
5c70: 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f  ,         BTREE_
5c80: 49 4e 43 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c  INCR_VACUUM, 0},
5c90: 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20      /* 4 */.    
5ca0: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 56      };.        V
5cb0: 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20  dbeOp *aOp;.    
5cc0: 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
5cd0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5ce0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
5cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
5d00: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
5d10: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
5d20: 65 28 73 65 74 4d 65 74 61 36 29 29 3b 0a 20 20  e(setMeta6));.  
5d30: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
5d40: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
5d50: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65  (v, ArraySize(se
5d60: 74 4d 65 74 61 36 29 2c 20 73 65 74 4d 65 74 61  tMeta6), setMeta
5d70: 36 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20  6, iLn);.       
5d80: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
5d90: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
5da0: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
5db0: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
5dc0: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f   iDb;.        aO
5dd0: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
5de0: 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32         aOp[2].p2
5df0: 20 3d 20 69 41 64 64 72 2b 34 3b 0a 20 20 20 20   = iAddr+4;.    
5e00: 20 20 20 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20      aOp[4].p1 = 
5e10: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  iDb;.        aOp
5e20: 5b 34 5d 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d  [4].p3 = eAuto -
5e30: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
5e40: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
5e50: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  (v, iDb);.      
5e60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
5e70: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  k;.  }.#endif.. 
5e80: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5e90: 20 5b 73 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d   [schema.]increm
5ea0: 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a  ental_vacuum(N).
5eb0: 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73    **.  ** Do N s
5ec0: 74 65 70 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e  teps of incremen
5ed0: 74 61 6c 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e  tal vacuuming on
5ee0: 20 61 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a   a database..  *
5ef0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5f00: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
5f10: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
5f20: 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55  INCREMENTAL_VACU
5f30: 55 4d 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c  UM: {.    int iL
5f40: 69 6d 69 74 2c 20 61 64 64 72 3b 0a 20 20 20 20  imit, addr;.    
5f50: 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  if( zRight==0 ||
5f60: 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33   !sqlite3GetInt3
5f70: 32 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69  2(zRight, &iLimi
5f80: 74 29 20 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20  t) || iLimit<=0 
5f90: 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20  ){.      iLimit 
5fa0: 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
5fb0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
5fc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
5fd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
5fe0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
5ff0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6000: 49 6e 74 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c  Integer, iLimit,
6010: 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20   1);.    addr = 
6020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6030: 31 28 76 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75  1(v, OP_IncrVacu
6040: 75 6d 2c 20 69 44 62 29 3b 20 56 64 62 65 43 6f  um, iDb); VdbeCo
6050: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
6060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6070: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
6080: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6090: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
60a0: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29  P_AddImm, 1, -1)
60b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
60c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
60d0: 50 6f 73 2c 20 31 2c 20 61 64 64 72 29 3b 20 56  Pos, 1, addr); V
60e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
60f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
6100: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
6110: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
6120: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
6140: 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a  ER_PRAGMAS.  /*.
6150: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
6160: 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65  hema.]cache_size
6170: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6180: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a  chema.]cache_siz
6190: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
61a0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
61b0: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
61c0: 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66   local setting f
61d0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  or the.  ** page
61e0: 20 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68 65   cache size. The
61f0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
6200: 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a  s the local.  **
6210: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
6220: 20 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69 73   value.  If N is
6230: 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20 74   positive then t
6240: 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  hat is the.  ** 
6250: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6260: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20 49  in the cache.  I
6270: 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65 2c  f N is negative,
6280: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e   then the.  ** n
6290: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
62a0: 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74 68  s adjusted so th
62b0: 61 74 20 74 68 65 20 63 61 63 68 65 20 75 73 65  at the cache use
62c0: 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a 20  s -N kibibytes. 
62d0: 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20   ** of memory.. 
62e0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
62f0: 79 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b  yp_CACHE_SIZE: {
6300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
6310: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
6320: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
6330: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67  );.    if( !zRig
6340: 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ht ){.      retu
6350: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70  rnSingleInt(v, p
6360: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
6370: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65  he_size);.    }e
6380: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  lse{.      int s
6390: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  ize = sqlite3Ato
63a0: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
63b0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
63c0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
63d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
63e0: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
63f0: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
6400: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
6410: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
6420: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6430: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6440: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69  chema.]cache_spi
6450: 6c 6c 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ll.  **  PRAGMA 
6460: 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c  cache_spill=BOOL
6470: 45 41 4e 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  EAN.  **  PRAGMA
6480: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6490: 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  spill=N.  **.  *
64a0: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
64b0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
64c0: 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69  rent local setti
64d0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
64e0: 70 61 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c  page cache spill
64f0: 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e   size. The secon
6500: 64 20 66 6f 72 6d 20 74 75 72 6e 73 20 63 61 63  d form turns cac
6510: 68 65 20 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a  he spill on.  **
6520: 20 6f 72 20 6f 66 66 2e 20 20 57 68 65 6e 20 74   or off.  When t
6530: 75 72 6e 6e 69 6e 67 20 63 61 63 68 65 20 73 70  urnning cache sp
6540: 69 6c 6c 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65  ill on, the size
6550: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
6560: 20 2a 2a 20 63 75 72 72 65 6e 74 20 63 61 63 68   ** current cach
6570: 65 5f 73 69 7a 65 2e 20 20 54 68 65 20 74 68 69  e_size.  The thi
6580: 72 64 20 66 6f 72 6d 20 73 65 74 73 20 61 20 73  rd form sets a s
6590: 70 69 6c 6c 20 73 69 7a 65 20 74 68 61 74 0a 20  pill size that. 
65a0: 20 2a 2a 20 6d 61 79 20 62 65 20 64 69 66 66 65   ** may be diffe
65b0: 72 65 6e 74 20 66 6f 72 6d 20 74 68 65 20 63 61  rent form the ca
65c0: 63 68 65 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49  che size..  ** I
65d0: 66 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20  f N is positive 
65e0: 74 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65  then that is the
65f0: 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
6600: 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
6610: 68 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67  he.  If N is neg
6620: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a  ative, then the.
6630: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6640: 61 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64  ages is adjusted
6650: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
6660: 68 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62  he uses -N kibib
6670: 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d  ytes.  ** of mem
6680: 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ory..  **.  ** I
6690: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
66a0: 63 61 63 68 65 5f 73 70 69 6c 6c 20 70 61 67 65  cache_spill page
66b0: 73 20 69 73 20 6c 65 73 73 20 74 68 65 6e 20 74  s is less then t
66c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
66d0: 2a 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61 67  * cache_size pag
66e0: 65 73 2c 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20  es, no spilling 
66f0: 6f 63 63 75 72 73 20 75 6e 74 69 6c 20 74 68 65  occurs until the
6700: 20 70 61 67 65 20 63 6f 75 6e 74 20 65 78 63 65   page count exce
6710: 65 64 73 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d  eds.  ** the num
6720: 62 65 72 20 6f 66 20 63 61 63 68 65 5f 73 69 7a  ber of cache_siz
6730: 65 20 70 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20  e pages..  **.  
6740: 2a 2a 20 54 68 65 20 63 61 63 68 65 5f 73 70 69  ** The cache_spi
6750: 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69  ll=BOOLEAN setti
6760: 6e 67 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6c  ng applies to al
6770: 6c 20 61 74 74 61 63 68 65 64 20 73 63 68 65 6d  l attached schem
6780: 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73  as,.  ** not jus
6790: 74 20 74 68 65 20 73 63 68 65 6d 61 20 73 70 65  t the schema spe
67a0: 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  cified..  */.  c
67b0: 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 43 48  ase PragTyp_CACH
67c0: 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61  E_SPILL: {.    a
67d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
67e0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
67f0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6800: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
6810: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
6820: 6c 65 49 6e 74 28 76 2c 0a 20 20 20 20 20 20 20  leInt(v,.       
6830: 20 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53    (db->flags & S
6840: 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c  QLITE_CacheSpill
6850: 29 3d 3d 30 20 3f 20 30 20 3a 20 0a 20 20 20 20  )==0 ? 0 : .    
6860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
6870: 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65  treeSetSpillSize
6880: 28 70 44 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20  (pDb->pBt,0));. 
6890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
68a0: 69 6e 74 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20  int size = 1;.  
68b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
68c0: 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20  etInt32(zRight, 
68d0: 26 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  &size) ){.      
68e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
68f0: 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e  tSpillSize(pDb->
6900: 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  pBt, size);.    
6910: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
6920: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
6930: 7a 52 69 67 68 74 2c 20 73 69 7a 65 21 3d 30 29  zRight, size!=0)
6940: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
6950: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
6960: 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20  CacheSpill;.    
6970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6980: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
6990: 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c  QLITE_CacheSpill
69a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69b0: 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73  setAllPagerFlags
69c0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (db);.    }.    
69d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
69e0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
69f0: 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a 65  chema.]mmap_size
6a00: 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  (N).  **.  ** Us
6a10: 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69 6e  ed to set mappin
6a20: 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54 68  g size limit. Th
6a30: 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 6c  e mapping size l
6a40: 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73 65  imit is.  ** use
6a50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 61  d to limit the a
6a60: 67 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f 66  ggregate size of
6a70: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70 70   all memory mapp
6a80: 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74 68  ed regions of th
6a90: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
6aa0: 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70 61  file. If this pa
6ab0: 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
6ac0: 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65 6d  o zero, then mem
6ad0: 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a 2a  ory mapping.  **
6ae0: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74 20   is not used at 
6af0: 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e 65  all.  If N is ne
6b00: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65  gative, then the
6b10: 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20   default memory 
6b20: 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 64  map.  ** limit d
6b30: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71 6c  etermined by sql
6b40: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
6b50: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
6b60: 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20 2a  IZE) is set..  *
6b70: 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  * The parameter 
6b80: 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e  N is measured in
6b90: 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a   bytes..  **.  *
6ba0: 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20  * This value is 
6bb0: 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20 75  advisory.  The u
6bc0: 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69 73  nderlying VFS is
6bd0: 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79 20   free to memory 
6be0: 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74 74  map.  ** as litt
6bf0: 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61 73  le or as much as
6c00: 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63 65   it wants.  Exce
6c10: 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74 20  pt, if N is set 
6c20: 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20 20  to 0 then the.  
6c30: 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73 20  ** upper layers 
6c40: 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f 6b  will never invok
6c50: 65 20 74 68 65 20 78 46 65 74 63 68 20 69 6e 74  e the xFetch int
6c60: 65 72 66 61 63 65 73 20 74 6f 20 74 68 65 20 56  erfaces to the V
6c70: 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  FS..  */.  case 
6c80: 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49 5a  PragTyp_MMAP_SIZ
6c90: 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E: {.    sqlite3
6ca0: 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20 53  _int64 sz;.#if S
6cb0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
6cc0: 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72 74  IZE>0.    assert
6cd0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6ce0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6cf0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6d00: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
6d10: 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73 71  int ii;.      sq
6d20: 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
6d30: 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29 3b  64(zRight, &sz);
6d40: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30 20  .      if( sz<0 
6d50: 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47 6c  ) sz = sqlite3Gl
6d60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
6d70: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  p;.      if( pId
6d80: 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73 7a  2->n==0 ) db->sz
6d90: 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20 20  Mmap = sz;.     
6da0: 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d   for(ii=db->nDb-
6db0: 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b  1; ii>=0; ii--){
6dc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
6dd0: 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20  >aDb[ii].pBt && 
6de0: 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32  (ii==iDb || pId2
6df0: 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  ->n==0) ){.     
6e00: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6e10: 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64 62  eSetMmapLimit(db
6e20: 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 73  ->aDb[ii].pBt, s
6e30: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
6e40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6e50: 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63 20  sz = -1;.    rc 
6e60: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
6e70: 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
6e80: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
6e90: 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23 65  P_SIZE, &sz);.#e
6ea0: 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a  lse.    sz = 0;.
6eb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6ec0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  OK;.#endif.    i
6ed0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6ee0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6ef0: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 7a 29  SingleInt(v, sz)
6f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6f10: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
6f20: 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50 61  UND ){.      pPa
6f30: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
6f40: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
6f50: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  rc;.    }.    br
6f60: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
6f70: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d   **   PRAGMA tem
6f80: 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20 20 50  p_store.  **   P
6f90: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
6fa0: 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22 6d 65   = "default"|"me
6fb0: 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20 20 2a  mory"|"file".  *
6fc0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
6fd0: 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76   set the local v
6fe0: 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d 70  alue of the temp
6ff0: 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 43 68  _store flag.  Ch
7000: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
7010: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
7020: 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
7030: 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
7040: 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75  le and the defau
7050: 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77 69  lt.  ** value wi
7060: 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
7070: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
7080: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
7090: 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ned..  **.  ** N
70a0: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 70  ote that it is p
70b0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
70c0: 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65 2d  library compile-
70d0: 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f 0a  time options to.
70e0: 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74 68    ** override th
70f0: 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  is setting.  */.
7100: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54    case PragTyp_T
7110: 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20 20 20  EMP_STORE: {.   
7120: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7130: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7140: 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74 65 6d  leInt(v, db->tem
7150: 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20 7d 65  p_store);.    }e
7160: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 6e 67  lse{.      chang
7170: 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50 61  eTempStorage(pPa
7180: 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  rse, zRight);.  
7190: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
71a0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
71b0: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
71c0: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
71d0: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
71e0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
71f0: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
7200: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
7210: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7220: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
7230: 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  the temp_store_d
7240: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7250: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7260: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7270: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7280: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
7290: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
72a0: 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 74  ..  ** Setting t
72b0: 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20  o a null string 
72c0: 72 65 76 65 72 74 73 20 74 6f 20 74 68 65 20 64  reverts to the d
72d0: 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61 72 79  efault temporary
72e0: 20 64 69 72 65 63 74 6f 72 79 20 73 65 61 72 63   directory searc
72f0: 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d 70 6f  h..  ** If tempo
7300: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 69  rary directory i
7310: 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
7320: 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53 74  invalidateTempSt
7330: 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  orage..  **.  */
7340: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7350: 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52 45 43  TEMP_STORE_DIREC
7360: 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  TORY: {.    if( 
7370: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
7380: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
7390: 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  t(v, sqlite3_tem
73a0: 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
73b0: 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
73c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
73d0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
73e0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
73f0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
7400: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
7410: 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20  ccess(db->pVfs, 
7420: 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41  zRight, SQLITE_A
7430: 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c  CCESS_READWRITE,
7440: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
7450: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7460: 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20  K || res==0 ){. 
7470: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7480: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7490: 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65   "not a writable
74a0: 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20   directory");.  
74b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
74c0: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  gma_out;.       
74d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
74e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d 50   if( SQLITE_TEMP
74f0: 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20 20  _STORE==0.      
7500: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50   || (SQLITE_TEMP
7510: 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62 2d  _STORE==1 && db-
7520: 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29 0a  >temp_store<=1).
7530: 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54         || (SQLIT
7540: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 20  E_TEMP_STORE==2 
7550: 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  && db->temp_stor
7560: 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  e==1).      ){. 
7570: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
7580: 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50 61  eTempStorage(pPa
7590: 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
75a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
75b0: 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
75c0: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20  rectory);.      
75d0: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
75e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
75f0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
7600: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
7610: 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b  f("%s", zRight);
7620: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
7640: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  mp_directory = 0
7650: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
7660: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7670: 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  WSD */.    }.   
7680: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66   break;.  }..#if
7690: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
76a0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
76b0: 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  A data_store_dir
76c0: 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52  ectory.  **   PR
76d0: 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f  AGMA data_store_
76e0: 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22  directory = ""|"
76f0: 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a  directory_name".
7700: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
7710: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
7720: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  l value of the d
7730: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
7740: 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ory flag.  Chang
7750: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ing.  ** the val
7760: 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66  ue sets a specif
7770: 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ic directory to 
7780: 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74 61  be used for data
7790: 62 61 73 65 20 66 69 6c 65 73 20 74 68 61 74 0a  base files that.
77a0: 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69 66    ** were specif
77b0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
77c0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 53  ive pathname.  S
77d0: 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c  etting to a null
77e0: 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73 0a   string reverts.
77f0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66 61    ** to the defa
7800: 75 6c 74 20 64 61 74 61 62 61 73 65 20 64 69 72  ult database dir
7810: 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66 6f  ectory, which fo
7820: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  r database files
7830: 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68 0a   specified with.
7840: 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65 20    ** a relative 
7850: 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61 62  path will probab
7860: 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ly be based on t
7870: 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63  he current direc
7880: 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a  tory for the.  *
7890: 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74 61  * process.  Data
78a0: 62 61 73 65 20 66 69 6c 65 20 73 70 65 63 69 66  base file specif
78b0: 69 65 64 20 77 69 74 68 20 61 6e 20 61 62 73 6f  ied with an abso
78c0: 6c 75 74 65 20 70 61 74 68 20 61 72 65 20 6e 6f  lute path are no
78d0: 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a 20  t impacted.  ** 
78e0: 62 79 20 74 68 69 73 20 73 65 74 74 69 6e 67 2c  by this setting,
78f0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 69   regardless of i
7900: 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20  ts value..  **. 
7910: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7920: 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44 49  yp_DATA_STORE_DI
7930: 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69  RECTORY: {.    i
7940: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
7950: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
7960: 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  Text(v, sqlite3_
7970: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b  data_directory);
7980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  .    }else{.#ifn
7990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
79a0: 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52  WSD.      if( zR
79b0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
79c0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
79d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
79e0: 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66  OsAccess(db->pVf
79f0: 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54  s, zRight, SQLIT
7a00: 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
7a10: 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  TE, &res);.     
7a20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7a30: 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29  E_OK || res==0 )
7a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7a50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7a60: 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61  se, "not a writa
7a70: 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b  ble directory");
7a80: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
7a90: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20  pragma_out;.    
7aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7ab0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7ac0: 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69  (sqlite3_data_di
7ad0: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20  rectory);.      
7ae0: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
7af0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7b00: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
7b10: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
7b20: 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b  f("%s", zRight);
7b30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7b40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
7b50: 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  ta_directory = 0
7b60: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
7b70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7b80: 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  WSD */.    }.   
7b90: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
7ba0: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  if..#if SQLITE_E
7bb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
7bc0: 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  YLE.  /*.  **   
7bd0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
7be0: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a  lock_proxy_file.
7bf0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
7c00: 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  chema.]lock_prox
7c10: 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f 3a  y_file = ":auto:
7c20: 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61 74  "|"lock_file_pat
7c30: 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  h".  **.  ** Ret
7c40: 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 76  urn or set the v
7c50: 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  alue of the lock
7c60: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61 67  _proxy_file flag
7c70: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
7c80: 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20   the value sets 
7c90: 61 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 20  a specific file 
7ca0: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64  to be used for d
7cb0: 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 6c  atabase access l
7cc0: 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  ocks..  **.  */.
7cd0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c    case PragTyp_L
7ce0: 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a 20  OCK_PROXY_FILE: 
7cf0: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
7d00: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
7d10: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
7d20: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
7d30: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 63 68  ->pBt);.      ch
7d40: 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f 70  ar *proxy_file_p
7d50: 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ath = NULL;.    
7d60: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7d70: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
7d80: 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
7d90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
7da0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
7db0: 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 47  (pFile, SQLITE_G
7dc0: 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
7dd0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
7df0: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b  roxy_file_path);
7e00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7e10: 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f 78 79  gleText(v, proxy
7e20: 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20  _file_path);.   
7e30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61   }else{.      Pa
7e40: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71  ger *pPager = sq
7e50: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
7e60: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
7e70: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
7e80: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
7e90: 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
7ea0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  .      int res;.
7eb0: 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74        if( zRight
7ec0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [0] ){.        r
7ed0: 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  es=sqlite3OsFile
7ee0: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53  Control(pFile, S
7ef0: 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
7f00: 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20  OXYFILE, .      
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 20 20 20 20 20 20 20 7a                 z
7f30: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 20  Right);.      } 
7f40: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 72  else {.        r
7f50: 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  es=sqlite3OsFile
7f60: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53  Control(pFile, S
7f70: 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
7f80: 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20  OXYFILE, .      
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 20 20 20 20 20 20 20 4e                 N
7fb0: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
7fc0: 20 20 20 20 69 66 28 20 72 65 73 21 3d 53 51 4c      if( res!=SQL
7fd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7fe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7ff0: 67 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c 65  g(pParse, "faile
8000: 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70 72  d to set lock pr
8010: 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20 20  oxy file");.    
8020: 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f      goto pragma_
8030: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
8040: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8050: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8060: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8070: 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20 20  G_STYLE */      
8080: 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .    .  /*.  ** 
8090: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
80a0: 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  .]synchronous.  
80b0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
80c0: 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73  ema.]synchronous
80d0: 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46  =OFF|ON|NORMAL|F
80e0: 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a 0a 20  ULL|EXTRA.  **. 
80f0: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
8100: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
8110: 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f  e of the synchro
8120: 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e  nous flag.  Chan
8130: 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f  ging.  ** the lo
8140: 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e  cal value does n
8150: 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20  ot make changes 
8160: 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  to the disk file
8170: 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65   and the.  ** de
8180: 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c  fault value will
8190: 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65   be restored the
81a0: 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64   next time the d
81b0: 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20  atabase is.  ** 
81c0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  opened..  */.  c
81d0: 61 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e 43  ase PragTyp_SYNC
81e0: 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20 69  HRONOUS: {.    i
81f0: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
8200: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
8210: 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61 66 65  Int(v, pDb->safe
8220: 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20 20 20  ty_level-1);.   
8230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
8240: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
8250: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8260: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8270: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
8280: 20 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c 20    "Safety level 
8290: 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  may not be chang
82a0: 65 64 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e  ed inside a tran
82b0: 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20  saction");.     
82c0: 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62 21 3d   }else if( iDb!=
82d0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
82e0: 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53 61   iLevel = (getSa
82f0: 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74  fetyLevel(zRight
8300: 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45 52  ,0,1)+1) & PAGER
8310: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
8320: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  K;.        if( i
8330: 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76 65  Level==0 ) iLeve
8340: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  l = 1;.        p
8350: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
8360: 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 20   = iLevel;.     
8370: 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74     pDb->bSyncSet
8380: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65   = 1;.        se
8390: 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64  tAllPagerFlags(d
83a0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
83b0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
83c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
83d0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
83e0: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
83f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41   SQLITE_OMIT_FLA
8400: 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65  G_PRAGMAS.  case
8410: 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20 7b   PragTyp_FLAG: {
8420: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
8430: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 50  =0 ){.      setP
8440: 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d  ragmaResultColum
8450: 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67 6d  nNames(v, pPragm
8460: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
8470: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64 62  SingleInt(v, (db
8480: 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61 67 6d  ->flags & pPragm
8490: 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a 20  a->iArg)!=0 );. 
84a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
84b0: 69 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72 61 67  int mask = pPrag
84c0: 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a 20  ma->iArg;    /* 
84d0: 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 6f 20  Mask of bits to 
84e0: 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a 2f  set or clear. */
84f0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
8500: 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
8510: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 69          /* Forei
8520: 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20 6d  gn key support m
8530: 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c 65  ay not be enable
8540: 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77 68  d or disabled wh
8550: 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  ile not.        
8560: 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ** in auto-commi
8570: 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20 20  t mode.  */.    
8580: 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51      mask &= ~(SQ
8590: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
85a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53  );.      }.#if S
85b0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
85c0: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20  NTICATION.      
85d0: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
85e0: 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55 73  hLevel==UAUTH_Us
85f0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  er ){.        /*
8600: 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e 6f   Do not allow no
8610: 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20 74 6f  n-admin users to
8620: 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65   modify the sche
8630: 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79 20 2a  ma arbitrarily *
8640: 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26  /.        mask &
8650: 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69 74 65  = ~(SQLITE_Write
8660: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d  Schema);.      }
8670: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
8680: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
8690: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20  lean(zRight, 0) 
86a0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66  ){.        db->f
86b0: 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
86c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
86d0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
86e0: 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 69  ~mask;.        i
86f0: 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45 5f  f( mask==SQLITE_
8700: 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d 3e 6e  DeferFKs ) db->n
8710: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
8720: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
8730: 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20 74      /* Many of t
8740: 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61 73 20  he flag-pragmas 
8750: 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64 65 20  modify the code 
8760: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
8770: 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20 63   SQL .      ** c
8780: 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63 6f 75  ompiler (eg. cou
8790: 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f 20  nt_changes). So 
87a0: 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 6f  add an opcode to
87b0: 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20 20 20   expire all.    
87c0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53 51    ** compiled SQ
87d0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 66 74  L statements aft
87e0: 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 70  er modifying a p
87f0: 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20 20  ragma value..   
8800: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
8810: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
8820: 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
8830: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8840: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  ags(db);.    }. 
8850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
8860: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8870: 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53  MIT_FLAG_PRAGMAS
8880: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
8890: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
88a0: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
88b0: 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65  *   PRAGMA table
88c0: 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a 20  _info(<table>). 
88d0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
88e0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f 72  a single row for
88f0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
8900: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
8910: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   The columns of.
8920: 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65    ** the returne
8930: 64 20 64 61 74 61 20 73 65 74 20 61 72 65 3a 0a  d data set are:.
8940: 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20 20    **.  ** cid:  
8950: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64 20        Column id 
8960: 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c  (numbered from l
8970: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 73 74  eft to right, st
8980: 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20 20 2a  arting at 0).  *
8990: 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 43 6f  * name:       Co
89a0: 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20 74  lumn name.  ** t
89b0: 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d  ype:       Colum
89c0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  n declaration ty
89d0: 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c  pe..  ** notnull
89e0: 3a 20 20 20 20 54 72 75 65 20 69 66 20 27 4e 4f  :    True if 'NO
89f0: 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72 74 20  T NULL' is part 
8a00: 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  of column declar
8a10: 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f  ation.  ** dflt_
8a20: 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66 61 75  value: The defau
8a30: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
8a40: 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e   column, if any.
8a50: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
8a60: 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a  gTyp_TABLE_INFO:
8a70: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
8a80: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8a90: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
8aa0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
8ab0: 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45  arse, LOCATE_NOE
8ac0: 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29  RR, zRight, zDb)
8ad0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
8ae0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b  {.      int i, k
8af0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64  ;.      int nHid
8b00: 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43  den = 0;.      C
8b10: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20  olumn *pCol;.   
8b20: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
8b30: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
8b40: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
8b50: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8b60: 20 3d 20 36 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 6;.      sqli
8b70: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
8b80: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
8b90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8ba0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
8bb0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  s(pParse, pTab);
8bc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
8bd0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
8be0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
8bf0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
8c00: 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
8c10: 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29 7b  nColumn(pCol) ){
8c20: 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64  .          nHidd
8c30: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
8c40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8c50: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
8c60: 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  (pCol->colFlags 
8c70: 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
8c80: 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
8c90: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20     k = 0;.      
8ca0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d    }else if( pPk=
8cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8cc0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  k = 1;.        }
8cd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8ce0: 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62  for(k=1; k<=pTab
8cf0: 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61  ->nCol && pPk->a
8d00: 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b  iColumn[k-1]!=i;
8d10: 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   k++){}.        
8d20: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
8d30: 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30  ( pCol->pDflt==0
8d40: 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d   || pCol->pDflt-
8d50: 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a  >op==TK_SPAN );.
8d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8d70: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
8d80: 31 2c 20 22 69 73 73 69 73 69 22 2c 0a 20 20 20  1, "issisi",.   
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 69 2d 6e 48              i-nH
8da0: 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  idden,.         
8db0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
8dc0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
8dd0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54    sqlite3ColumnT
8de0: 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20  ype(pCol,""),.  
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
8e00: 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a  l->notNull ? 1 :
8e10: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
8e20: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f     pCol->pDflt ?
8e30: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e   pCol->pDflt->u.
8e40: 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20  zToken : 0,.    
8e50: 20 20 20 20 20 20 20 20 20 20 20 6b 29 3b 0a 20             k);. 
8e60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8e70: 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65  .  break;..#ifde
8e80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8e90: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 54   case PragTyp_ST
8ea0: 41 54 53 3a 20 7b 0a 20 20 20 20 49 6e 64 65 78  ATS: {.    Index
8eb0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73 68   *pIdx;.    Hash
8ec0: 45 6c 65 6d 20 2a 69 3b 0a 20 20 20 20 70 50 61  Elem *i;.    pPa
8ed0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20  rse->nMem = 5;. 
8ee0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
8ef0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
8f00: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 66 6f 72  e, iDb);.    for
8f10: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
8f20: 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
8f30: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ->tblHash); i; i
8f40: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8f50: 69 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  i)){.      Table
8f60: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
8f70: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
8f80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
8f90: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73  tiLoad(v, 1, "ss
8fa0: 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20  iii",.          
8fb0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
8fc0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
8fd0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 73 7a 54         pTab->szT
8fe0: 61 62 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  abRow,.         
8ff0: 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
9000: 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  st,.           p
9010: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 29 3b 0a  Tab->tabFlags);.
9020: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
9030: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
9040: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9050: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ext){.        sq
9060: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9070: 61 64 28 76 2c 20 32 2c 20 22 73 69 69 69 58 22  ad(v, 2, "siiiX"
9080: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
9090: 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
90a0: 20 20 20 20 20 70 49 64 78 2d 3e 73 7a 49 64 78       pIdx->szIdx
90b0: 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
90c0: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
90d0: 74 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  t[0],.          
90e0: 20 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 29   pIdx->hasStat1)
90f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9100: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9110: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
9120: 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  5);.      }.    
9130: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
9140: 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 50 72  endif..  case Pr
9150: 61 67 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46 4f  agTyp_INDEX_INFO
9160: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
9170: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9180: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
9190: 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c  ;.    pIdx = sql
91a0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
91b0: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
91c0: 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
91d0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
91e0: 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20     int mx;.     
91f0: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
9200: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rg ){.        /*
9210: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69   PRAGMA index_xi
9220: 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69  nfo (newer versi
9230: 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77  on with more row
9240: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a  s and columns) *
9250: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
9260: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
9270: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9280: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65  em = 6;.      }e
9290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
92a0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66  PRAGMA index_inf
92b0: 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f  o (legacy versio
92c0: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  n) */.        mx
92d0: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
92e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
92f0: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
9300: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d    }.      pTab =
9310: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
9320: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9330: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9340: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9350: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
9360: 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e  >nMem<=pPragma->
9370: 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20 20  nPragCName );.  
9380: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d      for(i=0; i<m
9390: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
93a0: 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49 64 78   i16 cnum = pIdx
93b0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
93c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
93d0: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
93e0: 2c 20 22 69 69 73 58 22 2c 20 69 2c 20 63 6e 75  , "iisX", i, cnu
93f0: 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54 61  cnum<0 ? 0 : pTa
9420: 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e  b->aCol[cnum].zN
9430: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
9440: 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20  ( pPragma->iArg 
9450: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
9460: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9470: 64 28 76 2c 20 34 2c 20 22 69 73 69 58 22 2c 0a  d(v, 4, "isiX",.
9480: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
9490: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2c  ->aSortOrder[i],
94a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
94b0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20 20  x->azColl[i],.  
94c0: 20 20 20 20 20 20 20 20 20 20 69 3c 70 49 64 78            i<pIdx
94d0: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
94e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
94f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9500: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9510: 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   1, pParse->nMem
9520: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9530: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
9540: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e   case PragTyp_IN
9550: 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52  DEX_LIST: if( zR
9560: 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65  ight ){.    Inde
9570: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62  x *pIdx;.    Tab
9580: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e  le *pTab;.    in
9590: 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  t i;.    pTab = 
95a0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
95b0: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
95c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
95d0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
95e0: 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20  >nMem = 5;.     
95f0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
9600: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
9610: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72   iDb);.      for
9620: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9630: 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20 70  ex, i=0; pIdx; p
9640: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
9650: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
9660: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72 69  onst char *azOri
9670: 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20 22  gin[] = { "c", "
9680: 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20 20  u", "pk" };.    
9690: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
96a0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
96b0: 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20  isisi",.        
96c0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20     i,.          
96d0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pIdx->zName,.  
96e0: 20 20 20 20 20 20 20 20 20 49 73 55 6e 69 71 75           IsUniqu
96f0: 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20 20  eIndex(pIdx),.  
9700: 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67 69           azOrigi
9710: 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65 5d  n[pIdx->idxType]
9720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
9730: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
9740: 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
9750: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9760: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9770: 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a 20  _DATABASE_LIST: 
9780: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9790: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
97a0: 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  3;.    for(i=0; 
97b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
97c0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
97d0: 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63  Db[i].pBt==0 ) c
97e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
97f0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
9800: 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29 3b  ].zDbSName!=0 );
9810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9820: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9830: 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20 20  , "iss",.       
9840: 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64 62    i,.         db
9850: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
9860: 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  e,.         sqli
9870: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
9880: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ame(db->aDb[i].p
9890: 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Bt));.    }.  }.
98a0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
98b0: 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54 49   PragTyp_COLLATI
98c0: 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69  ON_LIST: {.    i
98d0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48 61  nt i = 0;.    Ha
98e0: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 70  shElem *p;.    p
98f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b  Parse->nMem = 2;
9900: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
9910: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9920: 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d  aCollSeq); p; p=
9930: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
9940: 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  )){.      CollSe
9950: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
9960: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
9970: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 73  Data(p);.      s
9980: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9990: 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c 20  oad(v, 1, "is", 
99a0: 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  i++, pColl->zNam
99b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
99c0: 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53  break;..#ifdef S
99d0: 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54  QLITE_INTROSPECT
99e0: 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 63 61  ION_PRAGMAS.  ca
99f0: 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e 43 54  se PragTyp_FUNCT
9a00: 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ION_LIST: {.    
9a10: 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73 68 45  int i;.    HashE
9a20: 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75 6e 63  lem *j;.    Func
9a30: 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50 61 72  Def *p;.    pPar
9a40: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
9a50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c    for(i=0; i<SQL
9a60: 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f 53 5a  ITE_FUNC_HASH_SZ
9a70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
9a80: 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c 74  r(p=sqlite3Built
9a90: 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d  inFunctions.a[i]
9aa0: 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73  ; p; p=p->u.pHas
9ab0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  h ){.        sql
9ac0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9ad0: 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d  d(v, 1, "si", p-
9ae0: 3e 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  >zName, 1);.    
9af0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
9b00: 72 28 6a 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(j=sqliteHashFi
9b10: 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b  rst(&db->aFunc);
9b20: 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68   j; j=sqliteHash
9b30: 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20  Next(j)){.      
9b40: 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71  p = (FuncDef*)sq
9b50: 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b  liteHashData(j);
9b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9b70: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9b80: 2c 20 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65  , "si", p->zName
9b90: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
9ba0: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65    break;..#ifnde
9bb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9bc0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 63 61 73  RTUALTABLE.  cas
9bd0: 65 20 50 72 61 67 54 79 70 5f 4d 4f 44 55 4c 45  e PragTyp_MODULE
9be0: 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 48 61 73  _LIST: {.    Has
9bf0: 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 70 50  hElem *j;.    pP
9c00: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a  arse->nMem = 1;.
9c10: 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65      for(j=sqlite
9c20: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9c30: 4d 6f 64 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73 71  Module); j; j=sq
9c40: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29  liteHashNext(j))
9c50: 7b 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  {.      Module *
9c60: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
9c70: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a  sqliteHashData(j
9c80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c90: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9ca0: 20 31 2c 20 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a   1, "s", pMod->z
9cb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
9cc0: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
9cd0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9ce0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
9cf0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9d00: 50 52 41 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20  PRAGMA_LIST: {. 
9d10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
9d20: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
9d30: 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 3b  ze(aPragmaName);
9d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
9d50: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9d60: 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 61 50 72  d(v, 1, "s", aPr
9d70: 61 67 6d 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d  agmaName[i].zNam
9d80: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
9d90: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
9da0: 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
9db0: 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f  CTION_PRAGMAS */
9dc0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
9dd0: 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50  TE_OMIT_SCHEMA_P
9de0: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
9df0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
9e00: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61 73  OREIGN_KEY.  cas
9e10: 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47  e PragTyp_FOREIG
9e20: 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28 20  N_KEY_LIST: if( 
9e30: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 46 4b  zRight ){.    FK
9e40: 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62  ey *pFK;.    Tab
9e50: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54  le *pTab;.    pT
9e60: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
9e70: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
9e80: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
9e90: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 46  pTab ){.      pF
9ea0: 4b 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b  K = pTab->pFKey;
9eb0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20 29  .      if( pFK )
9ec0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
9ed0: 3d 20 30 3b 20 0a 20 20 20 20 20 20 20 20 70 50  = 0; .        pP
9ee0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a  arse->nMem = 8;.
9ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
9f00: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
9f10: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
9f20: 20 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b 29        while(pFK)
9f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
9f40: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  j;.          for
9f50: 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f  (j=0; j<pFK->nCo
9f60: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
9f70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f80: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9f90: 22 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20 20  "iissssss",.    
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
9fb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9fc0: 20 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20 20       j,.        
9fd0: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e             pFK->
9fe0: 7a 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  zTo,.           
9ff0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
a000: 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ol[pFK->aCol[j].
a010: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20  iFrom].zName,.  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43   pFK->aCol[j].zC
a040: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
a050: 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d         actionNam
a060: 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31  e(pFK->aAction[1
a070: 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ]),  /* ON UPDAT
a080: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  E */.           
a090: 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61          actionNa
a0a0: 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b  me(pFK->aAction[
a0b0: 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45  0]),  /* ON DELE
a0c0: 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  TE */.          
a0d0: 20 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22 29           "NONE")
a0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a0f0: 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20          ++i;.   
a100: 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b         pFK = pFK
a110: 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20  ->pNextFrom;.   
a120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a130: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
a140: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
a150: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a160: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
a170: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a180: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
a190: 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  Y.#ifndef SQLITE
a1a0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
a1b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52  case PragTyp_FOR
a1c0: 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20  EIGN_KEY_CHECK: 
a1d0: 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b  {.    FKey *pFK;
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a1f0: 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  A foreign key co
a200: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
a210: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
a220: 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
a230: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52  table contain "R
a240: 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f  EFERENCES" keywo
a250: 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  rd */.    Table 
a260: 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
a270: 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65   /* Parent table
a280: 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e   that child poin
a290: 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64  ts to */.    Ind
a2a0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
a2b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
a2c0: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
a2d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   */.    int i;  
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a2f0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20  * Loop counter: 
a300: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d   Foreign key num
a310: 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  ber for pTab */.
a320: 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a340: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65  op counter:  Fie
a350: 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67  ld of the foreig
a360: 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73  n key */.    Has
a370: 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
a380: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a390: 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65  ter:  Next table
a3a0: 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20   in schema */.  
a3b0: 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20    int x;        
a3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75           /* resu
a3d0: 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  lt variable */. 
a3e0: 20 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74     int regResult
a3f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72  ;         /* 3 r
a400: 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
a410: 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
a420: 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b  .    int regKey;
a430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a440: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
a450: 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67  key for checking
a460: 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69   the FK */.    i
a470: 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20  nt regRow;      
a480: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
a490: 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77  rs to hold a row
a4a0: 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20   from pTab */.  
a4b0: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
a4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
a4d0: 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69  of a loop checki
a4e0: 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ng foreign keys 
a4f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f  */.    int addrO
a500: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
a510: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
a520: 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20  e key is OK */. 
a530: 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20     int *aiCols; 
a540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69            /* chi
a550: 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c  ld to parent col
a560: 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a  umn mapping */..
a570: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20      regResult = 
a580: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
a590: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
a5a0: 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65   += 4;.    regKe
a5b0: 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  y = ++pParse->nM
a5c0: 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  em;.    regRow =
a5d0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a5e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
a5f0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
a600: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b  rse, iDb);.    k
a610: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72   = sqliteHashFir
a620: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d  st(&db->aDb[iDb]
a630: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
a640: 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b  h);.    while( k
a650: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 52   ){.      if( zR
a660: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
a670: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
a680: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
a690: 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  , 0, zRight, zDb
a6a0: 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30  );.        k = 0
a6b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a6c0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54         pTab = (T
a6d0: 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
a6e0: 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20  Data(k);.       
a6f0: 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e   k = sqliteHashN
a700: 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  ext(k);.      }.
a710: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
a720: 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79  0 || pTab->pFKey
a730: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
a740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
a750: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
a760: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
a770: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
a780: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
a790: 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61  >nCol+regRow>pPa
a7a0: 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72  rse->nMem ) pPar
a7b0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d  se->nMem = pTab-
a7c0: 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a  >nCol + regRow;.
a7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
a7e0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  nTable(pParse, 0
a7f0: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
a800: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
a810: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
a820: 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65 73  String(v, regRes
a830: 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ult, pTab->zName
a840: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
a850: 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65  , pFK=pTab->pFKe
a860: 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b  y; pFK; i++, pFK
a870: 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pFK->pNextFrom)
a880: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e  {.        pParen
a890: 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  t = sqlite3FindT
a8a0: 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54  able(db, pFK->zT
a8b0: 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  o, zDb);.       
a8c0: 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20   if( pParent==0 
a8d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a8e0: 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
a8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
a900: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
a910: 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75  Db, pParent->tnu
a920: 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a  m, 0, pParent->z
a930: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78  Name);.        x
a940: 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61   = sqlite3FkLoca
a950: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
a960: 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70  pParent, pFK, &p
a970: 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
a980: 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20   if( x==0 ){.   
a990: 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d         if( pIdx=
a9a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a9b0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
a9c0: 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 44  le(pParse, i, iD
a9d0: 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f  b, pParent, OP_O
a9e0: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
a9f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aa00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aa10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
aa20: 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64 78  penRead, i, pIdx
aa30: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
aa40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aa50: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
aa60: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
aa70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
aa80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa90: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
aaa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
aac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
aad0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20  arse->nErr>0 || 
aae0: 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pFK==0 );.      
aaf0: 69 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b  if( pFK ) break;
ab00: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
ab10: 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72  e->nTab<i ) pPar
ab20: 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20  se->nTab = i;.  
ab30: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
ab40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ab50: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29  v, OP_Rewind, 0)
ab60: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
ab70: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
ab80: 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65  , pFK=pTab->pFKe
ab90: 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b  y; pFK; i++, pFK
aba0: 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pFK->pNextFrom)
abb0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e  {.        pParen
abc0: 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  t = sqlite3FindT
abd0: 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54  able(db, pFK->zT
abe0: 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  o, zDb);.       
abf0: 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20   pIdx = 0;.     
ac00: 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20     aiCols = 0;. 
ac10: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65         if( pPare
ac20: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
ac30: 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63  x = sqlite3FkLoc
ac40: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
ac50: 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26   pParent, pFK, &
ac60: 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a  pIdx, &aiCols);.
ac70: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
ac80: 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x==0 );.      
ac90: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
aca0: 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
acb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
acc0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
acd0: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20  te code to read 
ace0: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61  the child key va
acf0: 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74  lues into regist
ad00: 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ers.        ** r
ad10: 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e 2e  egRow..regRow+n.
ad20: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63   If any of the c
ad30: 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20  hild key values 
ad40: 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73 20 0a  are NULL, this .
ad50: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 63          ** row c
ad60: 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e 20 46  annot cause an F
ad70: 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75 6d  K violation. Jum
ad80: 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 64  p directly to ad
ad90: 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20 20 20  drOk in .       
ada0: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 2a   ** this case. *
adb0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  /.        for(j=
adc0: 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20  0; j<pFK->nCol; 
add0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
ade0: 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c  int iCol = aiCol
adf0: 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20  s ? aiCols[j] : 
ae00: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
ae10: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  om;.          sq
ae20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
ae30: 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
ae40: 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c 2c 20   pTab, 0, iCol, 
ae50: 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20  regRow+j);.     
ae60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
ae80: 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61  ull, regRow+j, a
ae90: 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65  ddrOk); VdbeCove
aea0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
aeb0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
aec0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
aed0: 71 75 65 72 79 20 74 68 65 20 70 61 72 65 6e 74  query the parent
aee0: 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d 61 74   index for a mat
aef0: 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20 20 20  ching parent.   
af00: 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49 66 20       ** key. If 
af10: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
af20: 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 4f 6b  , jump to addrOk
af30: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
af40: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20   pIdx ){.       
af50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af60: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
af70: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70  ecord, regRow, p
af80: 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79  FK->nCol, regKey
af90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
afa0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
afb0: 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64 78 29  nityStr(db,pIdx)
afc0: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  , pFK->nCol);.  
afd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
afe0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
aff0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64  OP_Found, i, add
b000: 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b  rOk, regKey, 0);
b010: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
b020: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b030: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
b040: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
b050: 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73 71 6c     int jmp = sql
b060: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b070: 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20 20 20  ddr(v)+2;.      
b080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b090: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
b0a0: 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c 20 72  Rowid, i, jmp, r
b0b0: 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65  egRow); VdbeCove
b0c0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b0d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
b0e0: 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  to(v, addrOk);. 
b0f0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b100: 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b   pFK->nCol==1 );
b110: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
b120: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
b130: 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74 20 61  code to report a
b140: 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 20 74  n FK violation t
b150: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  o the caller. */
b160: 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73  .        if( Has
b170: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
b180: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b1a0: 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 65  _Rowid, 0, regRe
b1b0: 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  sult+1);.       
b1c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b1e0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
b1f0: 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b  0, regResult+1);
b200: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
b220: 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52 65  ltiLoad(v, regRe
b230: 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c 20 70  sult+2, "siX", p
b240: 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20  FK->zTo, i-1);. 
b250: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b260: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
b270: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
b280: 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ult, 4);.       
b290: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b2a0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
b2b0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ok);.        sql
b2c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
b2d0: 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a  iCols);.      }.
b2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
b300: 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b 31  xt, 0, addrTop+1
b310: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b320: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b330: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b340: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d   addrTop);.    }
b350: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
b360: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b370: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
b380: 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20  GGER) */.#endif 
b390: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b3a0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
b3b0: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
b3c0: 20 4e 44 45 42 55 47 0a 20 20 63 61 73 65 20 50   NDEBUG.  case P
b3d0: 72 61 67 54 79 70 5f 50 41 52 53 45 52 5f 54 52  ragTyp_PARSER_TR
b3e0: 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  ACE: {.    if( z
b3f0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
b400: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
b410: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20  lean(zRight, 0) 
b420: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b430: 65 33 50 61 72 73 65 72 54 72 61 63 65 28 73 74  e3ParserTrace(st
b440: 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22  dout, "parser: "
b450: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
b470: 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29  arserTrace(0, 0)
b480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b490: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
b4a0: 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74  dif..  /* Reinst
b4b0: 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e 64  all the LIKE and
b4c0: 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e   GLOB functions.
b4d0: 20 20 54 68 65 20 76 61 72 69 61 6e 74 20 6f 66    The variant of
b4e0: 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20   LIKE.  ** used 
b4f0: 77 69 6c 6c 20 62 65 20 63 61 73 65 20 73 65 6e  will be case sen
b500: 73 69 74 69 76 65 20 6f 72 20 6e 6f 74 20 64 65  sitive or not de
b510: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 52  pending on the R
b520: 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  HS..  */.  case 
b530: 50 72 61 67 54 79 70 5f 43 41 53 45 5f 53 45 4e  PragTyp_CASE_SEN
b540: 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20  SITIVE_LIKE: {. 
b550: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
b560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b570: 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69  gisterLikeFuncti
b580: 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47  ons(db, sqlite3G
b590: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
b5a0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 0));.    }.  }
b5b0: 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64  .  break;..#ifnd
b5c0: 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52  ef SQLITE_INTEGR
b5d0: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
b5e0: 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  MAX.# define SQL
b5f0: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
b600: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30  ECK_ERROR_MAX 10
b610: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
b620: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
b630: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20 20  TEGRITY_CHECK.  
b640: 2f 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  /*    PRAGMA int
b650: 65 67 72 69 74 79 5f 63 68 65 63 6b 0a 20 20 2a  egrity_check.  *
b660: 2a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  *    PRAGMA inte
b670: 67 72 69 74 79 5f 63 68 65 63 6b 28 4e 29 0a 20  grity_check(N). 
b680: 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75   **    PRAGMA qu
b690: 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20  ick_check.  **  
b6a0: 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63    PRAGMA quick_c
b6b0: 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a  heck(N).  **.  *
b6c0: 2a 20 56 65 72 69 66 79 20 74 68 65 20 69 6e 74  * Verify the int
b6d0: 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 64 61  egrity of the da
b6e0: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
b6f0: 2a 20 54 68 65 20 22 71 75 69 63 6b 5f 63 68 65  * The "quick_che
b700: 63 6b 22 20 69 73 20 72 65 64 75 63 65 64 20 76  ck" is reduced v
b710: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
b720: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
b730: 64 65 73 69 67 6e 65 64 20 74 6f 20 64 65 74 65  designed to dete
b740: 63 74 20 6d 6f 73 74 20 64 61 74 61 62 61 73 65  ct most database
b750: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a   corruption.  **
b760: 20 77 69 74 68 6f 75 74 20 74 68 65 20 6f 76 65   without the ove
b770: 72 68 65 61 64 20 6f 66 20 63 72 6f 73 73 2d 63  rhead of cross-c
b780: 68 65 63 6b 69 6e 67 20 69 6e 64 65 78 65 73 2e  hecking indexes.
b790: 20 20 51 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20    Quick_check.  
b7a0: 2a 2a 20 69 73 20 6c 69 6e 65 61 72 20 74 69 6d  ** is linear tim
b7b0: 65 20 77 68 65 72 65 61 73 65 20 69 6e 74 65 67  e wherease integ
b7c0: 72 69 74 79 5f 63 68 65 63 6b 20 69 73 20 4f 28  rity_check is O(
b7d0: 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63  NlogN)..  */.  c
b7e0: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 54 45  ase PragTyp_INTE
b7f0: 47 52 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20  GRITY_CHECK: {. 
b800: 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64     int i, j, add
b810: 72 2c 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69  r, mxErr;..    i
b820: 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71  nt isQuick = (sq
b830: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65  lite3Tolower(zLe
b840: 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20  ft[0])=='q');.. 
b850: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41     /* If the PRA
b860: 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  GMA command was 
b870: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41  of the form "PRA
b880: 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69  GMA <db>.integri
b890: 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a  ty_check",.    *
b8a0: 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20 73 65  * then iDb is se
b8b0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
b8c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
b8d0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62  dentified by <db
b8e0: 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  >..    ** In thi
b8f0: 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65  s case, the inte
b900: 67 72 69 74 79 20 6f 66 20 64 61 74 61 62 61 73  grity of databas
b910: 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65  e iDb only is ve
b920: 72 69 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  rified by.    **
b930: 20 74 68 65 20 56 44 42 45 20 63 72 65 61 74 65   the VDBE create
b940: 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  d below..    **.
b950: 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
b960: 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , if the command
b970: 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41   was simply "PRA
b980: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
b990: 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20  eck" (or.    ** 
b9a0: 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68  "PRAGMA quick_ch
b9b0: 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20  eck"), then iDb 
b9c0: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20  is set to 0. In 
b9d0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 69  this case, set i
b9e0: 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20  Db.    ** to -1 
b9f0: 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74  here, to indicat
ba00: 65 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  e that the VDBE 
ba10: 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68  should verify th
ba20: 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20  e integrity.    
ba30: 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68  ** of all attach
ba40: 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a  ed databases.  *
ba50: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  /.    assert( iD
ba60: 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  b>=0 );.    asse
ba70: 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49  rt( iDb==0 || pI
ba80: 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28  d2->z );.    if(
ba90: 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44   pId2->z==0 ) iD
baa0: 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20  b = -1;..    /* 
bab0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56  Initialize the V
bac0: 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  DBE program */. 
bad0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
bae0: 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 6;..    /* Set
baf0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 65 72 72   the maximum err
bb00: 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  or count */.    
bb10: 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49  mxErr = SQLITE_I
bb20: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
bb30: 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66  RROR_MAX;.    if
bb40: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
bb50: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
bb60: 32 28 7a 52 69 67 68 74 2c 20 26 6d 78 45 72 72  2(zRight, &mxErr
bb70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 45  );.      if( mxE
bb80: 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr<=0 ){.       
bb90: 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f   mxErr = SQLITE_
bba0: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
bbb0: 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20  ERROR_MAX;.     
bbc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
bbd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bbe0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78  , OP_Integer, mx
bbf0: 45 72 72 2d 31 2c 20 31 29 3b 20 2f 2a 20 72 65  Err-1, 1); /* re
bc00: 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72  g[1] holds error
bc10: 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f  s left */..    /
bc20: 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74  * Do an integrit
bc30: 79 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68 20  y check on each 
bc40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
bc50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bc60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
bc70: 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 78       HashElem *x
bc80: 3b 0a 20 20 20 20 20 20 48 61 73 68 20 2a 70 54  ;.      Hash *pT
bc90: 62 6c 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  bls;.      int *
bca0: 61 52 6f 6f 74 3b 0a 20 20 20 20 20 20 69 6e 74  aRoot;.      int
bcb0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
bcc0: 69 6e 74 20 6d 78 49 64 78 20 3d 20 30 3b 0a 20  int mxIdx = 0;. 
bcd0: 20 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a 0a       int nIdx;..
bce0: 20 20 20 20 20 20 69 66 28 20 4f 4d 49 54 5f 54        if( OMIT_T
bcf0: 45 4d 50 44 42 20 26 26 20 69 3d 3d 31 20 29 20  EMPDB && i==1 ) 
bd00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
bd10: 69 66 28 20 69 44 62 3e 3d 30 20 26 26 20 69 21  if( iDb>=0 && i!
bd20: 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b  =iDb ) continue;
bd30: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ..      sqlite3C
bd40: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
bd50: 70 50 61 72 73 65 2c 20 69 29 3b 0a 0a 20 20 20  pParse, i);..   
bd60: 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65     /* Do an inte
bd70: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 66 20 74  grity check of t
bd80: 68 65 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  he B-Tree.      
bd90: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 67 69  **.      ** Begi
bda0: 6e 20 62 79 20 66 69 6e 64 69 6e 67 20 74 68 65  n by finding the
bdb0: 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62   root pages numb
bdc0: 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ers.      ** for
bdd0: 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
bde0: 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20 64  indices in the d
bdf0: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
be00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
be10: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
be20: 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30 29  exHeld(db, i, 0)
be30: 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73 20   );.      pTbls 
be40: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53  = &db->aDb[i].pS
be50: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
be60: 20 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c        for(cnt=0,
be70: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72   x=sqliteHashFir
be80: 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d  st(pTbls); x; x=
be90: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78  sqliteHashNext(x
bea0: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
beb0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
bec0: 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20  HashData(x);.   
bed0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
bee0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61  ;.        if( Ha
bef0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 63  sRowid(pTab) ) c
bf00: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt++;.        fo
bf10: 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d 70  r(nIdx=0, pIdx=p
bf20: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
bf30: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
bf40: 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 20 63 6e  ext, nIdx++){ cn
bf50: 74 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  t++; }.        i
bf60: 66 28 20 6e 49 64 78 3e 6d 78 49 64 78 20 29 20  f( nIdx>mxIdx ) 
bf70: 6d 78 49 64 78 20 3d 20 6e 49 64 78 3b 0a 20 20  mxIdx = nIdx;.  
bf80: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f      }.      aRoo
bf90: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
bfa0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
bfb0: 65 6f 66 28 69 6e 74 29 2a 28 63 6e 74 2b 31 29  eof(int)*(cnt+1)
bfc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52 6f  );.      if( aRo
bfd0: 6f 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ot==0 ) break;. 
bfe0: 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20       for(cnt=0, 
bff0: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
c000: 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73  t(pTbls); x; x=s
c010: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29  qliteHashNext(x)
c020: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
c030: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c040: 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20  ashData(x);.    
c050: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c060: 0a 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73  .        if( Has
c070: 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 61 52  Rowid(pTab) ) aR
c080: 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 54 61  oot[cnt++] = pTa
c090: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  b->tnum;.       
c0a0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
c0b0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
c0c0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
c0d0: 0a 20 20 20 20 20 20 20 20 20 20 61 52 6f 6f 74  .          aRoot
c0e0: 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49 64 78 2d 3e  [cnt++] = pIdx->
c0f0: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tnum;.        }.
c100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52        }.      aR
c110: 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30 3b 0a 0a 20  oot[cnt] = 0;.. 
c120: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
c130: 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e 75 6d  e sufficient num
c140: 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
c150: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
c160: 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 50  ated */.      pP
c170: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58  arse->nMem = MAX
c180: 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20  ( pParse->nMem, 
c190: 38 2b 6d 78 49 64 78 20 29 3b 0a 20 20 20 20 20  8+mxIdx );.     
c1a0: 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
c1b0: 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
c1c0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  );..      /* Do 
c1d0: 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67  the b-tree integ
c1e0: 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20  rity checks */. 
c1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c200: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74  AddOp4(v, OP_Int
c210: 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74  egrityCk, 2, cnt
c220: 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f  , 1, (char*)aRoo
c230: 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  t,P4_INTARRAY);.
c240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c250: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
c260: 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  )i);.      addr 
c270: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c280: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
c290: 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 2); VdbeCovera
c2a0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
c2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
c2c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
c2d0: 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   3, 0,.         
c2e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c2f0: 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62  b, "*** in datab
c300: 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64  ase %s ***\n", d
c310: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
c320: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50 34  me),.         P4
c330: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
c340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c350: 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32  p3(v, OP_Move, 2
c360: 2c 20 34 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  , 4, 1);.      s
c370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c380: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
c390: 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20 20 20 69  , 3, 2);.      i
c3a0: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
c3b0: 75 6c 74 52 6f 77 28 76 2c 20 32 29 3b 0a 20 20  ultRow(v, 2);.  
c3c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c3d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
c3e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
c3f0: 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e   sure all the in
c400: 64 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72  dices are constr
c410: 75 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  ucted correctly.
c420: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c430: 66 6f 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68  for(x=sqliteHash
c440: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
c450: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
c460: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
c470: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c480: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
c490: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c4a0: 49 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20  Idx, *pPk;.     
c4b0: 20 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72     Index *pPrior
c4c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
c4d0: 74 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20  t loopTop;.     
c4e0: 20 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c     int iDataCur,
c4f0: 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
c500: 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a    int r1 = -1;..
c510: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
c520: 2d 3e 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69  ->tnum<1 ) conti
c530: 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49  nue;  /* Skip VI
c540: 45 57 73 20 6f 72 20 56 49 52 54 55 41 4c 20 54  EWs or VIRTUAL T
c550: 41 42 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20 20  ABLEs */.       
c560: 20 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63   if( pTab->pChec
c570: 6b 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  k==0.         &&
c580: 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
c590: 20 26 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c   & TF_HasNotNull
c5a0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
c5b0: 20 28 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d   (pTab->pIndex==
c5c0: 30 20 7c 7c 20 69 73 51 75 69 63 6b 29 0a 20 20  0 || isQuick).  
c5d0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
c5e0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
c5f0: 20 4e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   No additional c
c600: 68 65 63 6b 73 20 6e 65 65 64 65 64 20 66 6f 72  hecks needed for
c610: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
c620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c630: 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28   pPk = HasRowid(
c640: 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69  pTab) ? 0 : sqli
c650: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
c660: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
c670: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
c680: 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
c690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c6a0: 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69  OpenTableAndIndi
c6b0: 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ces(pParse, pTab
c6c0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30  , OP_OpenRead, 0
c6d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61 74       1, 0, &iDat
c700: 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b  aCur, &iIdxCur);
c710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c720: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c730: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29 3b  _Integer, 0, 7);
c740: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
c750: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
c760: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c770: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b  pIdx->pNext, j++
c780: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
c790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c7a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
c7b0: 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20   8+j); /* index 
c7c0: 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72 20  entries counter 
c7d0: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
c7e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
c7f0: 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29  rse->nMem>=8+j )
c800: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c810: 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  ( sqlite3NoTemps
c820: 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65 2c 31  InRange(pParse,1
c830: 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20 20  ,7+j) );.       
c840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c850: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
c860: 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b 20 56   iDataCur, 0); V
c870: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c880: 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20          loopTop 
c890: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c8a0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
c8b0: 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 7, 1);.       
c8c0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
c8d0: 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  all NOT NULL col
c8e0: 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20  umns really are 
c8f0: 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  NOT NULL */.    
c900: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
c910: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
c920: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
c930: 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20  *zErr;.         
c940: 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20   int jmp2;.     
c950: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
c960: 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
c970: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
c980: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
c990: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e  notNull==0 ) con
c9a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
c9b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c9c0: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
c9d0: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
c9e0: 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20  ur, j, 3);.     
c9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ca00: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
ca10: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
ca20: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
ca30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ca40: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
ca50: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
ca60: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
ca70: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  zErr = sqlite3MP
ca80: 72 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20  rintf(db, "NULL 
ca90: 76 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c  value in %s.%s",
caa0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
cad0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
cae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
caf0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
cb00: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
cb10: 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44  3, 0, zErr, P4_D
cb20: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
cb30: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
cb40: 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29  kResultRow(v, 3)
cb50: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cb60: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
cb70: 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20  v, jmp2);.      
cb80: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56    }.        /* V
cb90: 65 72 69 66 79 20 43 48 45 43 4b 20 63 6f 6e 73  erify CHECK cons
cba0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
cbb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cbc0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
cbd0: 6e 2c 20 69 44 61 74 61 43 75 72 2c 20 70 54 61  n, iDataCur, pTa
cbe0: 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 33 29 3b 0a 20  b->nCol-1, 3);. 
cbf0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
cc00: 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e  >pCheck && (db->
cc10: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
cc20: 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20  gnoreChecks)==0 
cc30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
cc40: 72 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d 20  rList *pCheck = 
cc50: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cc60: 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68  up(db, pTab->pCh
cc70: 65 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eck, 0);.       
cc80: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
cc90: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
cca0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
ccb0: 64 72 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c 69  drCkFault = sqli
ccc0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ccd0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
cce0: 20 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20   int addrCkOk = 
ccf0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
cd00: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
cd10: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
cd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
cd30: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
cd40: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
cd50: 20 3d 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b   = iDataCur + 1;
cd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
cd70: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
cd80: 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
cd90: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 43 68         for(k=pCh
cda0: 65 63 6b 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b 3e  eck->nExpr-1; k>
cdb0: 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 20  0; k--){.       
cdc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
cdd0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
cde0: 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e 70  , pCheck->a[k].p
cdf0: 45 78 70 72 2c 20 61 64 64 72 43 6b 46 61 75 6c  Expr, addrCkFaul
ce00: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
ce10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
ce20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
ce30: 75 65 28 70 50 61 72 73 65 2c 20 70 43 68 65 63  ue(pParse, pChec
ce40: 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  k->a[0].pExpr, a
ce50: 64 64 72 43 6b 4f 6b 2c 20 0a 20 20 20 20 20 20  ddrCkOk, .      
ce60: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ce70: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
ce80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ce90: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
cea0: 6c 28 76 2c 20 61 64 64 72 43 6b 46 61 75 6c 74  l(v, addrCkFault
ceb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
cec0: 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
ced0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
cee0: 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d   zErr = sqlite3M
cef0: 50 72 69 6e 74 66 28 64 62 2c 20 22 43 48 45 43  Printf(db, "CHEC
cf00: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  K constraint fai
cf10: 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20 20 20 20  led in %s",.    
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
cf30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
cf40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf50: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
cf60: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20  ring8, 0, 3, 0, 
cf70: 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
cf80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
cf90: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
cfa0: 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20  ultRow(v, 3);.  
cfb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cfc0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
cfd0: 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29 3b 0a  l(v, addrCkOk);.
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cff0: 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
d000: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d010: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
d020: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d030: 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63 6b 29  lete(db, pCheck)
d040: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d050: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
d060: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f  index entries fo
d070: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
d080: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  w */.        for
d090: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
d0a0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
d0b0: 20 21 69 73 51 75 69 63 6b 3b 20 70 49 64 78 3d   !isQuick; pIdx=
d0c0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b  pIdx->pNext, j++
d0d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
d0e0: 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70   jmp2, jmp3, jmp
d0f0: 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20  4, jmp5;.       
d100: 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20     int ckUniq = 
d110: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d120: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
d130: 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78     if( pPk==pIdx
d140: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d150: 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
d160: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
d170: 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
d180: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 30  , iDataCur, 0, 0
d190: 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20 20 20  , &jmp3,.       
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20  pPrior, r1);.   
d1d0: 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20         pPrior = 
d1e0: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
d1f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d200: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
d210: 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20 69 6e 63  8+j, 1);  /* inc
d220: 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63 6f 75  rement entry cou
d230: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nt */.          
d240: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
d250: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 65 78  n index entry ex
d260: 69 73 74 73 20 66 6f 72 20 74 68 65 20 63 75 72  ists for the cur
d270: 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a  rent table row *
d280: 2f 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32  /.          jmp2
d290: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d2a0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
d2b0: 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  und, iIdxCur+j, 
d2c0: 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20 20 20  ckUniq, r1,.    
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29    pIdx->nColumn)
d300: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d320: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
d330: 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22 29  ng(v, 3, "row ")
d340: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d350: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d360: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33   OP_Concat, 7, 3
d370: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
d380: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
d390: 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69  tring(v, 4, " mi
d3a0: 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78  ssing from index
d3b0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   ");.          s
d3c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d3d0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
d3e0: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d3f0: 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65     jmp5 = sqlite
d400: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d410: 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  v, 4, pIdx->zNam
d420: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
d430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d440: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c  v, OP_Concat, 4,
d450: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
d460: 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67 72 69    jmp4 = integri
d470: 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77  tyCheckResultRow
d480: 28 76 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  (v, 3);.        
d490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d4a0: 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a  pHere(v, jmp2);.
d4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
d4c0: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65 73 2c   UNIQUE indexes,
d4d0: 20 76 65 72 69 66 79 20 74 68 61 74 20 6f 6e 6c   verify that onl
d4e0: 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78 69 73  y one entry exis
d4f0: 74 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  ts with the.    
d500: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
d510: 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74 72 79   key.  The entry
d520: 20 69 73 20 75 6e 69 71 75 65 20 69 66 20 28 31   is unique if (1
d530: 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  ) any column is 
d540: 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 2a  NULL.          *
d550: 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e 65 78  * or (2) the nex
d560: 74 20 65 6e 74 72 79 20 68 61 73 20 61 20 64 69  t entry has a di
d570: 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20  fferent key */. 
d580: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 55           if( IsU
d590: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
d5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d5b0: 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73 71 6c  int uniqOk = sql
d5c0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d5d0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
d5e0: 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20 20    int jmp6;.    
d5f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 6b 3b 0a          int kk;.
d600: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
d610: 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e  kk=0; kk<pIdx->n
d620: 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20  KeyCol; kk++){. 
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
d640: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
d650: 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20  Column[kk];.    
d660: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
d670: 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44  ( iCol!=XN_ROWID
d680: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
d690: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Col );.         
d6a0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
d6b0: 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   && pTab->aCol[i
d6c0: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63  Col].notNull ) c
d6d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d6e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d700: 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e  sNull, r1+kk, un
d710: 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  iqOk);.         
d720: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
d730: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d740: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d750: 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp6 = sqlite3Vd
d760: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
d770: 65 78 74 2c 20 69 49 64 78 43 75 72 2b 6a 29 3b  ext, iIdxCur+j);
d780: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d7a0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
d7b0: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
d7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
d7e0: 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
d7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d800: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 47 54  4Int(v, OP_IdxGT
d810: 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75 6e 69  , iIdxCur+j, uni
d820: 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  qOk, r1,.       
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
d850: 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
d860: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d870: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d880: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
d890: 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65  3, "non-unique e
d8a0: 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20 22 29  ntry in index ")
d8b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d8c0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
d8d0: 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20 20   jmp5);.        
d8e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d8f0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 75  esolveLabel(v, u
d900: 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  niqOk);.        
d910: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
d920: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d930: 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20 20 20  e(v, jmp4);.    
d940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
d950: 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
d960: 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29 3b 0a  (pParse, jmp3);.
d970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d990: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
d9a0: 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70 54 6f  iDataCur, loopTo
d9b0: 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  p); VdbeCoverage
d9c0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
d9d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d9e0: 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a  (v, loopTop-1);.
d9f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
da00: 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
da10: 20 20 20 20 20 20 20 69 66 28 20 21 69 73 51 75         if( !isQu
da20: 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ick ){.         
da30: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
da40: 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22 77 72  String(v, 2, "wr
da50: 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69 65 73  ong # of entries
da60: 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20   in index ");.  
da70: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
da80: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
da90: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
daa0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29  Idx->pNext, j++)
dab0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
dac0: 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f  ( pPk==pIdx ) co
dad0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
dae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
daf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
db00: 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 33 29  t, iIdxCur+j, 3)
db10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ;.            ad
db20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
db30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
db40: 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20 56 64 62   8+j, 0, 3); Vdb
db50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
db60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
db70: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
db80: 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29   SQLITE_NOTNULL)
db90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
dba0: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
dbb0: 69 6e 67 28 76 2c 20 33 2c 20 70 49 64 78 2d 3e  ing(v, 3, pIdx->
dbc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
dbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dbe0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63  ddOp3(v, OP_Conc
dbf0: 61 74 2c 20 33 2c 20 32 2c 20 37 29 3b 0a 20 20  at, 3, 2, 7);.  
dc00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72            integr
dc10: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
dc20: 77 28 76 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  w(v, 7);.       
dc30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
dc50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
dc60: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
dc70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
dc80: 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
dc90: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20     } .    }.    
dca0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
dcb0: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
dcc0: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
dcd0: 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74  O(2);.      stat
dce0: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
dcf0: 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20  ist endCode[] = 
dd00: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41  {.        { OP_A
dd10: 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30  ddImm,      1, 0
dd20: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
dd30: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
dd40: 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  { OP_IfNotZero, 
dd50: 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30    1, 4,        0
dd60: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
dd70: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
dd80: 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20  g8,     0, 3,   
dd90: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32       0},    /* 2
dda0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
ddb0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c  _ResultRow,   3,
ddc0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   1,        0},  
ddd0: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
dde0: 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  };.      VdbeOp 
ddf0: 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70  *aOp;..      aOp
de00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
de10: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
de20: 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20 65  Size(endCode), e
de30: 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20  ndCode, iLn);.  
de40: 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20      if( aOp ){. 
de50: 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32         aOp[0].p2
de60: 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20 20 20   = 1-mxErr;.    
de70: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70      aOp[2].p4typ
de80: 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a 20  e = P4_STATIC;. 
de90: 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34         aOp[2].p4
dea0: 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20  .z = "ok";.     
deb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
dec0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
ded0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
dee0: 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
def0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
df00: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20  MIT_UTF16.  /*. 
df10: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63   **   PRAGMA enc
df20: 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41  oding.  **   PRA
df30: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22  GMA encoding = "
df40: 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c  utf-8"|"utf-16"|
df50: 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d  "utf-16le"|"utf-
df60: 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  16be".  **.  ** 
df70: 49 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f 72  In its first for
df80: 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72  m, this pragma r
df90: 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64  eturns the encod
dfa0: 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a  ing of the main.
dfb0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49    ** database. I
dfc0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
dfd0: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  s not initialize
dfe0: 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  d, it is initial
dff0: 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20  ized now..  **. 
e000: 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
e010: 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67  orm of this prag
e020: 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ma is a no-op if
e030: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e040: 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73  se file.  ** has
e050: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
e060: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49  n initialized. I
e070: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73  n this case it s
e080: 65 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a  ets the default.
e090: 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68    ** encoding th
e0a0: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
e0b0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
e0c0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20  abase file if a 
e0d0: 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  new file.  ** is
e0e0: 20 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20   created. If an 
e0f0: 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61  existing main da
e100: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
e110: 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  pened, then the.
e120: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78    ** default tex
e130: 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74  t encoding for t
e140: 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
e150: 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20  base is used..  
e160: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20  ** .  ** In all 
e170: 63 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61  cases new databa
e180: 73 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  ses created usin
e190: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
e1a0: 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72  mand are.  ** cr
e1b0: 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65  eated to use the
e1c0: 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65   same default te
e1d0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74  xt encoding as t
e1e0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e1f0: 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61  . If.  ** the ma
e200: 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20  in database has 
e210: 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  not been initial
e220: 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61  ized and/or crea
e230: 74 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a  ted when ATTACH.
e240: 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64    ** is executed
e250: 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  , this is done b
e260: 65 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48  efore the ATTACH
e270: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a   operation..  **
e280: 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63  .  ** In the sec
e290: 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72  ond form this pr
e2a0: 61 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65  agma sets the te
e2b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62  xt encoding to b
e2c0: 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e  e used in.  ** n
e2d0: 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ew database file
e2e0: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
e2f0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61  this database ha
e300: 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ndle. It is only
e310: 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20  .  ** useful if 
e320: 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74  invoked immediat
e330: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61  ely after the ma
e340: 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20  in database i.  
e350: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
e360: 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20  p_ENCODING: {.  
e370: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
e380: 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a  truct EncName {.
e390: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
e3a0: 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b  e;.      u8 enc;
e3b0: 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b  .    } encnames[
e3c0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55  ] = {.      { "U
e3d0: 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45  TF8",     SQLITE
e3e0: 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a  _UTF8        },.
e3f0: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c        { "UTF-8",
e400: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
e410: 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75         },  /* Mu
e420: 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31  st be element [1
e430: 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  ] */.      { "UT
e440: 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f  F-16le", SQLITE_
e450: 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20  UTF16LE     },  
e460: 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65  /* Must be eleme
e470: 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20  nt [2] */.      
e480: 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51  { "UTF-16be", SQ
e490: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20  LITE_UTF16BE    
e4a0: 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   },  /* Must be 
e4b0: 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20  element [3] */. 
e4c0: 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22       { "UTF16le"
e4d0: 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ,  SQLITE_UTF16L
e4e0: 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  E     },.      {
e4f0: 20 22 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c   "UTF16be",  SQL
e500: 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20  ITE_UTF16BE     
e510: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  },.      { "UTF-
e520: 31 36 22 2c 20 20 20 30 20 20 20 20 20 20 20 20  16",   0        
e530: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20            }, /* 
e540: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
e550: 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  VE */.      { "U
e560: 54 46 31 36 22 2c 20 20 20 20 30 20 20 20 20 20  TF16",    0     
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20               }, 
e580: 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  /* SQLITE_UTF16N
e590: 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b  ATIVE */.      {
e5a0: 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20   0, 0 }.    };. 
e5b0: 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20     const struct 
e5c0: 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20  EncName *pEnc;. 
e5d0: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
e5e0: 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20  {    /* "PRAGMA 
e5f0: 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20  encoding" */.   
e600: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
e610: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
e620: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
e630: 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ut;.      assert
e640: 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54  ( encnames[SQLIT
e650: 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c  E_UTF8].enc==SQL
e660: 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20  ITE_UTF8 );.    
e670: 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d    assert( encnam
e680: 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  es[SQLITE_UTF16L
e690: 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  E].enc==SQLITE_U
e6a0: 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20  TF16LE );.      
e6b0: 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73  assert( encnames
e6c0: 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d  [SQLITE_UTF16BE]
e6d0: 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  .enc==SQLITE_UTF
e6e0: 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65  16BE );.      re
e6f0: 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76  turnSingleText(v
e700: 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70  , encnames[ENC(p
e710: 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d  Parse->db)].zNam
e720: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  e);.    }else{  
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41        /* "PRAGMA
e750: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22   encoding = XXX"
e760: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   */.      /* Onl
e770: 79 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  y change the val
e780: 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63  ue of sqlite.enc
e790: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
e7a0: 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20   handle is not. 
e7b0: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
e7c0: 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e  zed. If the main
e7d0: 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73   database exists
e7e0: 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  , the new sqlite
e7f0: 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20  .enc value.     
e800: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   ** will be over
e810: 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65  written when the
e820: 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20   schema is next 
e830: 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f  loaded. If it do
e840: 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
e850: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20  already exists, 
e860: 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  it will be creat
e870: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65  ed to use the ne
e880: 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65  w encoding value
e890: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e8a0: 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 21 28   if( .        !(
e8b0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
e8c0: 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
e8d0: 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20  aded)) || .     
e8e0: 20 20 20 44 62 48 61 73 50 72 6f 70 65 72 74 79     DbHasProperty
e8f0: 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79  (db, 0, DB_Empty
e900: 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
e910: 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e      for(pEnc=&en
e920: 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d  cnames[0]; pEnc-
e930: 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b  >zName; pEnc++){
e940: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
e950: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
e960: 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a  (zRight, pEnc->z
e970: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
e980: 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28       SCHEMA_ENC(
e990: 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a  db) = ENC(db) =.
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63  pEnc->enc ? pEnc
e9c0: 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55  ->enc : SQLITE_U
e9d0: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
e9e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e9f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ea00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ea10: 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b   !pEnc->zName ){
ea20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ea30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ea40: 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20  e, "unsupported 
ea50: 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a  encoding: %s", z
ea60: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
ea70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ea80: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
ea90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
eaa0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
eab0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
eac0: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f  _SCHEMA_VERSION_
ead0: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
eae0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
eaf0: 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69  ma.]schema_versi
eb00: 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  on.  **   PRAGMA
eb10: 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61   [schema.]schema
eb20: 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65  _version = <inte
eb30: 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ger>.  **.  **  
eb40: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
eb50: 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20  ]user_version.  
eb60: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
eb70: 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f  ema.]user_versio
eb80: 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  n = <integer>.  
eb90: 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  **.  **   PRAGMA
eba0: 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69   [schema.]freeli
ebb0: 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20  st_count.  **.  
ebc0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
ebd0: 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f  ema.]data_versio
ebe0: 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  n.  **.  **   PR
ebf0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70  AGMA [schema.]ap
ec00: 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a  plication_id.  *
ec10: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
ec20: 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f  ma.]application_
ec30: 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  id = <integer>. 
ec40: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61   **.  ** The pra
ec50: 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72  gma's schema_ver
ec60: 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65  sion and user_ve
ec70: 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  rsion are used t
ec80: 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a  o set or get.  *
ec90: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
eca0: 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f  he schema-versio
ecb0: 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69  n and user-versi
ecc0: 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  on, respectively
ecd0: 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20  . Both.  ** the 
ece0: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61  schema-version a
ecf0: 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65 72 73  nd the user-vers
ed00: 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73  ion are 32-bit s
ed10: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20  igned integers. 
ed20: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
ed30: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
ed40: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
ed50: 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69   schema-cookie i
ed60: 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d  s usually only m
ed70: 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72  anipulated inter
ed80: 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e  nally by SQLite.
ed90: 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72   It.  ** is incr
eda0: 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74  emented by SQLit
edb0: 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64  e whenever the d
edc0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69  atabase schema i
edd0: 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20  s modified (by. 
ede0: 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20   ** creating or 
edf0: 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65  dropping a table
ee00: 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20   or index). The 
ee10: 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69  schema version i
ee20: 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53  s used by.  ** S
ee30: 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20  QLite each time 
ee40: 61 20 71 75 65 72 79 20 69 73 20 65 78 65 63 75  a query is execu
ee50: 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ted to ensure th
ee60: 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
ee70: 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68  cache.  ** of th
ee80: 65 20 73 63 68 65 6d 61 20 75 73 65 64 20 77 68  e schema used wh
ee90: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  en compiling the
eea0: 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68   SQL query match
eeb0: 65 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  es the schema of
eec0: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
eed0: 73 65 20 61 67 61 69 6e 73 74 20 77 68 69 63 68  se against which
eee0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75   the compiled qu
eef0: 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ery is actually 
ef00: 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53  executed..  ** S
ef10: 75 62 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d  ubverting this m
ef20: 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e  echanism by usin
ef30: 67 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61  g "PRAGMA schema
ef40: 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64  _version" to mod
ef50: 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ify.  ** the sch
ef60: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70  ema-version is p
ef70: 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65  otentially dange
ef80: 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61  rous and may lea
ef90: 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a  d to program.  *
efa0: 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64 61 74  * crashes or dat
efb0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
efc0: 2e 20 55 73 65 20 77 69 74 68 20 63 61 75 74 69  . Use with cauti
efd0: 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  on!.  **.  ** Th
efe0: 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69  e user-version i
eff0: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
f000: 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e  nally by SQLite.
f010: 20 49 74 20 6d 61 79 20 62 65 20 75 73 65 64 20   It may be used 
f020: 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74  by.  ** applicat
f030: 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72  ions for any pur
f040: 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  pose..  */.  cas
f050: 65 20 50 72 61 67 54 79 70 5f 48 45 41 44 45 52  e PragTyp_HEADER
f060: 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e  _VALUE: {.    in
f070: 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61  t iCookie = pPra
f080: 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57  gma->iArg;  /* W
f090: 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72  hich cookie to r
f0a0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a  ead or write */.
f0b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
f0c0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
f0d0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
f0e0: 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50   && (pPragma->mP
f0f0: 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
f100: 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b  _ReadOnly)==0 ){
f110: 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
f120: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  the specified co
f130: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
f140: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f150: 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43   VdbeOpList setC
f160: 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  ookie[] = {.    
f170: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
f180: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20  tion,    0,  1, 
f190: 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a   0},    /* 0 */.
f1a0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74          { OP_Set
f1b0: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20  Cookie,      0, 
f1c0: 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31   0,  0},    /* 1
f1d0: 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   */.      };.   
f1e0: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
f1f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f200: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
f210: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
f220: 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29  Size(setCookie))
f230: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
f240: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
f250: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
f260: 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43  setCookie), setC
f270: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
f280: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
f290: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
f2a0: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
f2b0: 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69     aOp[0].p1 = i
f2c0: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
f2d0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f2e0: 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f   aOp[1].p2 = iCo
f2f0: 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b  okie;.      aOp[
f300: 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41  1].p3 = sqlite3A
f310: 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
f320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
f330: 20 52 65 61 64 20 74 68 65 20 73 70 65 63 69 66   Read the specif
f340: 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ied cookie value
f350: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
f360: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
f370: 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d  t readCookie[] =
f380: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
f390: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
f3a0: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
f3b0: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
f3c0: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
f3d0: 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d        0,  1,  0}
f3e0: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
f3f0: 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74       { OP_Result
f400: 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31  Row,       1,  1
f410: 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20  ,  0}.      };. 
f420: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
f430: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f440: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
f450: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
f460: 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69  aySize(readCooki
f470: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
f480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f490: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
f4a0: 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72  ze(readCookie),r
f4b0: 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20  eadCookie,0);.  
f4c0: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
f4d0: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
f4e0: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
f4f0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
f500: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
f510: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
f520: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20      aOp[1].p3 = 
f530: 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73  iCookie;.      s
f540: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
f550: 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  le(v);.    }.  }
f560: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
f570: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f580: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50  SCHEMA_VERSION_P
f590: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
f5a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
f5b0: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
f5c0: 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  GS.  /*.  **   P
f5d0: 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70  RAGMA compile_op
f5e0: 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tions.  **.  ** 
f5f0: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73  Return the names
f600: 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d   of all compile-
f610: 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65  time options use
f620: 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
f630: 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e  .  ** one option
f640: 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20   per row..  */. 
f650: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f   case PragTyp_CO
f660: 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b  MPILE_OPTIONS: {
f670: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
f680: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f690: 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65  zOpt;.    pParse
f6a0: 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20  ->nMem = 1;.    
f6b0: 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73  while( (zOpt = s
f6c0: 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
f6d0: 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d  tion_get(i++))!=
f6e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f6f0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
f700: 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20  (v, 1, zOpt);.  
f710: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f720: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
f730: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
f740: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
f750: 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a  dbeReusable(v);.
f760: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
f770: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
f780: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
f790: 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64  _DIAGS */..#ifnd
f7a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
f7b0: 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  AL.  /*.  **   P
f7c0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77  RAGMA [schema.]w
f7d0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20  al_checkpoint = 
f7e0: 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73  passive|full|res
f7f0: 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20  tart|truncate.  
f800: 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69  **.  ** Checkpoi
f810: 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  nt the database.
f820: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
f830: 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f  gTyp_WAL_CHECKPO
f840: 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  INT: {.    int i
f850: 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44  Bt = (pId2->z?iD
f860: 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b:SQLITE_MAX_ATT
f870: 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20  ACHED);.    int 
f880: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
f890: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
f8a0: 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  E;.    if( zRigh
f8b0: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
f8c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
f8d0: 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30  ight, "full")==0
f8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
f8f0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
f900: 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20  POINT_FULL;.    
f910: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f920: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f930: 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30  t, "restart")==0
f940: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
f950: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
f960: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20  POINT_RESTART;. 
f970: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
f980: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
f990: 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22  ight, "truncate"
f9a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f9b0: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
f9c0: 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
f9d0: 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
f9e0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  }.    pParse->nM
f9f0: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69  em = 3;.    sqli
fa00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fa10: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
fa20: 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a  iBt, eMode, 1);.
fa30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fa40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
fa50: 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20  ltRow, 1, 3);.  
fa60: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a  }.  break;..  /*
fa70: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77  .  **   PRAGMA w
fa80: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
fa90: 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  t.  **   PRAGMA 
faa0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
fab0: 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  nt = N.  **.  **
fac0: 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74   Configure a dat
fad0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
fae0: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
faf0: 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64  y checkpoint a d
fb00: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74  atabase.  ** aft
fb10: 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  er accumulating 
fb20: 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  N frames in the 
fb30: 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f  log. Or query fo
fb40: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  r the current va
fb50: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20  lue.  ** of N.. 
fb60: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
fb70: 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  yp_WAL_AUTOCHECK
fb80: 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28  POINT: {.    if(
fb90: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
fba0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
fbb0: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
fbc0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
fbd0: 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ht));.    }.    
fbe0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
fbf0: 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78  v, .       db->x
fc00: 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c  WalCallback==sql
fc10: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
fc20: 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  ok ? .          
fc30: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
fc40: 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20  NT(db->pWalArg) 
fc50: 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  : 0);.  }.  brea
fc60: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a  k;.#endif..  /*.
fc70: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72    **  PRAGMA shr
fc80: 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a  ink_memory.  **.
fc90: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
fca0: 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d  ION-OF: R-23445-
fcb0: 34 36 31 30 39 20 54 68 69 73 20 70 72 61 67 6d  46109 This pragm
fcc0: 61 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  a causes the dat
fcd0: 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65  abase.  ** conne
fce0: 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69  ction on which i
fcf0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  t is invoked to 
fd00: 66 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20  free up as much 
fd10: 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a  memory as it.  *
fd20: 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e  * can, by callin
fd30: 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  g sqlite3_db_rel
fd40: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20  ease_memory().. 
fd50: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
fd60: 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59  yp_SHRINK_MEMORY
fd70: 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
fd80: 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
fd90: 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  y(db);.    break
fda0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
fdb0: 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a    PRAGMA optimiz
fdc0: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f  e.  **  PRAGMA o
fdd0: 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20  ptimize(MASK).  
fde0: 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d  **  PRAGMA schem
fdf0: 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20  a.optimize.  ** 
fe00: 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f   PRAGMA schema.o
fe10: 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20  ptimize(MASK).  
fe20: 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74 20  **.  ** Attempt 
fe30: 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20  to optimize the 
fe40: 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20 73  database.  All s
fe50: 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69 6d  chemas are optim
fe60: 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72 73  ized in the firs
fe70: 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73  t.  ** two forms
fe80: 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73  , and only the s
fe90: 70 65 63 69 66 69 65 64 20 73 63 68 65 6d 61 20  pecified schema 
fea0: 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20  is optimized in 
feb0: 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a  the latter two..
fec0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65    **.  ** The de
fed0: 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a  tails of optimiz
fee0: 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ations performed
fef0: 20 62 79 20 74 68 69 73 20 70 72 61 67 6d 61 20   by this pragma 
ff00: 61 72 65 20 65 78 70 65 63 74 65 64 0a 20 20 2a  are expected.  *
ff10: 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64 20  * to change and 
ff20: 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69 6d  improve over tim
ff30: 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73  e.  Applications
ff40: 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70 61   should anticipa
ff50: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69  te that.  ** thi
ff60: 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70 65  s pragma will pe
ff70: 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69  rform new optimi
ff80: 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75 72  zations in futur
ff90: 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a  e releases..  **
ffa0: 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e  .  ** The option
ffb0: 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  al argument is a
ffc0: 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
ffd0: 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65 72  mizations to per
ffe0: 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
fff0: 20 20 20 30 78 30 30 30 31 20 20 20 20 44 65 62     0x0001    Deb
10000 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f  ugging mode.  Do
10010 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70 65   not actually pe
10020 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69  rform any optimi
10030 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20  zations.  **    
10040 20 20 20 20 20 20 20 20 20 20 62 75 74 20 69 6e            but in
10050 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e 65  stead return one
10060 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 6f   line of text fo
10070 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61 74  r each optimizat
10080 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ion.  **        
10090 20 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c 64        that would
100a0 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e   have been done.
100b0 20 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c 74    Off by default
100c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30  ..  **.  **    0
100d0 78 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e 41  x0002    Run ANA
100e0 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20 74  LYZE on tables t
100f0 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66 69  hat might benefi
10100 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75 6c  t.  On by defaul
10110 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t..  **         
10120 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20 66       See below f
10130 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
10140 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  formation..  **.
10150 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20 20    **    0x0004  
10160 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65    (Not yet imple
10170 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20 75  mented) Record u
10180 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72 6d  sage and perform
10190 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20 20  ance .  **      
101a0 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74          informat
101b0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ion from the cur
101c0 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e 20  rent session in 
101d0 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  the.  **        
101e0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
101f0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 77  ile so that it w
10200 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ill be available
10210 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20   to "optimize". 
10220 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
10230 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79 20   pragmas run by 
10240 66 75 74 75 72 65 20 64 61 74 61 62 61 73 65 20  future database 
10250 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
10260 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 38  *.  **    0x0008
10270 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70      (Not yet imp
10280 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74 65  lemented) Create
10290 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d 69   indexes that mi
102a0 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20 20  ght have.  **   
102b0 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20             been 
102c0 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65 6e  helpful to recen
102d0 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20  t queries.  **. 
102e0 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
102f0 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77 61  MASK is and alwa
10300 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66 66  ys shall be 0xff
10310 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61 6e  fe.  0xfffe mean
10320 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20  s perform all.  
10330 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69  ** of the optimi
10340 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61  zations listed a
10350 62 6f 76 65 20 65 78 63 65 70 74 20 44 65 62 75  bove except Debu
10360 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e  g Mode, includin
10370 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d  g new.  ** optim
10380 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61  izations that ha
10390 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
103a0 69 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65  invented.  If ne
103b0 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  w optimizations 
103c0 61 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64  are.  ** ever ad
103d0 64 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ded that should 
103e0 62 65 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c  be off by defaul
103f0 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d  t, those off-by-
10400 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70  default .  ** op
10410 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c  timizations will
10420 20 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f   have bitmasks o
10430 66 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72  f 0x10000 or lar
10440 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ger..  **.  ** D
10450 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20  ETERMINATION OF 
10460 57 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c  WHEN TO RUN ANAL
10470 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  YZE.  **.  ** In
10480 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
10490 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74  lementation, a t
104a0 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64  able is analyzed
104b0 20 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20   if only if all 
104c0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  of.  ** the foll
104d0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
104e0 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41    **.  ** (1) MA
104f0 53 4b 20 62 69 74 20 30 78 30 32 20 69 73 20 73  SK bit 0x02 is s
10500 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32  et..  **.  ** (2
10510 29 20 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e  ) The query plan
10520 6e 65 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f  ner used sqlite_
10530 73 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74  stat1-style stat
10540 69 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f  istics for one o
10550 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20  r.  **     more 
10560 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74  indexes of the t
10570 61 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69  able at some poi
10580 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  nt during the li
10590 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20  fetime of.  **  
105a0 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63     the current c
105b0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  onnection..  **.
105c0 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20    ** (3) One or 
105d0 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20  more indexes of 
105e0 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 63 75  the table are cu
105f0 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a  rrently unanalyz
10600 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74  ed OR.  **     t
10610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
10620 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68  s in the table h
10630 61 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  as increased by 
10640 32 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65  25 times or more
10650 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20  .  **     since 
10660 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e  the last time AN
10670 41 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20  ALYZE was run.. 
10680 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c   **.  ** The rul
10690 65 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c  es for when tabl
106a0 65 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20  es are analyzed 
106b0 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68  are likely to ch
106c0 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74  ange in.  ** fut
106d0 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20  ure releases..  
106e0 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
106f0 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20  p_OPTIMIZE: {.  
10700 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20    int iDbLast;  
10710 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10720 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69   termination poi
10730 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d  nt for the schem
10740 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  a loop */.    in
10750 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20  t iTabCur;      
10760 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
10770 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65  or a table whose
10780 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63   size needs chec
10790 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68  king */.    Hash
107a0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
107b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20     /* Loop over 
107c0 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65  tables of a sche
107d0 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61  ma */.    Schema
107e0 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20   *pSchema;      
107f0 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
10800 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61  schema */.    Ta
10810 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
10820 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
10830 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  in the schema */
10840 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
10850 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
10860 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  n index of the t
10870 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45  able */.    LogE
10880 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20  st szThreshold; 
10890 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73     /* Size thres
108a0 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68  hold above which
108b0 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e   reanalysis is n
108c0 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72  eedd */.    char
108d0 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20   *zSubSql;      
108e0 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
108f0 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53  ent for the OP_S
10900 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f  qlExec opcode */
10910 0a 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b  .    u32 opMask;
10920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10930 61 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ask of operation
10940 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  s to perform */.
10950 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
10960 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  ){.      opMask 
10970 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 41 74  = (u32)sqlite3At
10980 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
10990 20 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20    if( (opMask & 
109a0 30 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b  0x02)==0 ) break
109b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
109c0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66     opMask = 0xff
109d0 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54  fe;.    }.    iT
109e0 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  abCur = pParse->
109f0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28  nTab++;.    for(
10a00 69 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44  iDbLast = zDb?iD
10a10 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b:db->nDb-1; iDb
10a20 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b  <=iDbLast; iDb++
10a30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
10a40 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
10a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
10a60 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
10a70 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
10a80 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e    pSchema = db->
10a90 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
10aa0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71  ;.      for(k=sq
10ab0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
10ac0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
10ad0 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73  ; k; k=sqliteHas
10ae0 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
10af0 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
10b00 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
10b10 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  (k);..        /*
10b20 20 49 66 20 74 61 62 6c 65 20 70 54 61 62 20 68   If table pTab h
10b30 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64  as not been used
10b40 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 77   in a way that w
10b50 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f  ould benefit fro
10b60 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76  m.        ** hav
10b70 69 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61  ing analysis sta
10b80 74 69 73 74 69 63 73 20 64 75 72 69 6e 67 20 74  tistics during t
10b90 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69  he current sessi
10ba0 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74  on, then skip it
10bb0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  ..        ** Thi
10bc0 73 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65  s also has the e
10bd0 66 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e  ffect of skippin
10be0 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  g virtual tables
10bf0 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20   and views */.  
10c00 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d        if( (pTab-
10c10 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53  >tabFlags & TF_S
10c20 74 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63  tatsUsed)==0 ) c
10c30 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
10c40 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69    /* Reanalyze i
10c50 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 32  f the table is 2
10c60 35 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74  5 times larger t
10c70 68 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61  han the last ana
10c80 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20  lysis */.       
10c90 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70   szThreshold = p
10ca0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
10cb0 2b 20 34 36 3b 20 61 73 73 65 72 74 28 20 73 71  + 46; assert( sq
10cc0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d  lite3LogEst(25)=
10cd0 3d 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66  =46 );.        f
10ce0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
10cf0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
10d00 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
10d10 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 49           if( !pI
10d20 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a  dx->hasStat1 ){.
10d30 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 54 68              szTh
10d40 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20  reshold = 0; /* 
10d50 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69  Always analyze i
10d60 66 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b  f any index lack
10d70 73 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  s statistics */.
10d80 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
10d90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
10da0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10db0 20 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64   if( szThreshold
10dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10dd0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
10de0 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20  Parse, iTabCur, 
10df0 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
10e00 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20  enRead);.       
10e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10e20 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61  dOp3(v, OP_IfSma
10e30 6c 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a  ller, iTabCur, .
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10e60 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10e70 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c  v)+2+(opMask&1),
10e80 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20   szThreshold);. 
10e90 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
10ea0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10eb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62    }.        zSub
10ec0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
10ed0 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a  intf(db, "ANALYZ
10ee0 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22  E \"%w\".\"%w\""
10ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
10f20 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  zDbSName, pTab->
10f30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
10f40 69 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30  if( opMask & 0x0
10f50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  1 ){.          i
10f60 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
10f70 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
10f90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10fa0 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
10fb0 20 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c   r1, 0, zSubSql,
10fc0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
10fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10fe0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10ff0 52 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31  ResultRow, r1, 1
11000 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11010 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11020 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11030 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20   OP_SqlExec, 0, 
11040 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50  0, 0, zSubSql, P
11050 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
11060 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11070 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
11080 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11090 45 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65  Expire);.    bre
110a0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
110b0 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79  **   PRAGMA busy
110c0 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20  _timeout.  **   
110d0 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65  PRAGMA busy_time
110e0 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  out = N.  **.  *
110f0 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62  * Call sqlite3_b
11100 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20  usy_timeout(db, 
11110 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  N).  Return the 
11120 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20  current timeout 
11130 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e  value.  ** if on
11140 65 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f  e is set.  If no
11150 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72   busy handler or
11160 20 61 20 64 69 66 66 65 72 65 6e 74 20 62 75 73   a different bus
11170 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74  y handler is set
11180 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20  .  ** then 0 is 
11190 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69  returned.  Setti
111a0 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65  ng the busy_time
111b0 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61  out to 0 or nega
111c0 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c  tive.  ** disabl
111d0 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a  es the timeout..
111e0 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72    */.  /*case Pr
111f0 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f  agTyp_BUSY_TIMEO
11200 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a  UT*/ default: {.
11210 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 61      assert( pPra
11220 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50  gma->ePragTyp==P
11230 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45  ragTyp_BUSY_TIME
11240 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  OUT );.    if( z
11250 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
11260 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
11270 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41  out(db, sqlite3A
11280 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20  toi(zRight));.  
11290 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
112a0 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62  ngleInt(v, db->b
112b0 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20  usyTimeout);.   
112c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
112d0 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
112e0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a  soft_heap_limit.
112f0 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f    **   PRAGMA so
11300 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20  ft_heap_limit = 
11310 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  N.  **.  ** IMPL
11320 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
11330 2d 32 36 33 34 33 2d 34 35 39 33 30 20 54 68 69  -26343-45930 Thi
11340 73 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73  s pragma invokes
11350 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
11360 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
11370 74 36 34 28 29 20 69 6e 74 65 72 66 61 63 65 20  t64() interface 
11380 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e  with the argumen
11390 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a  t N, if N is.  *
113a0 2a 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20  * specified and 
113b0 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
113c0 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20  e integer..  ** 
113d0 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
113e0 46 3a 20 52 2d 36 34 34 35 31 2d 30 37 31 36 33  F: R-64451-07163
113f0 20 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c   The soft_heap_l
11400 69 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61  imit pragma alwa
11410 79 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ys.  ** returns 
11420 74 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72  the same integer
11430 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72   that would be r
11440 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20  eturned by the. 
11450 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74   ** sqlite3_soft
11460 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31  _heap_limit64(-1
11470 29 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e  ) C-language fun
11480 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
11490 73 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f  se PragTyp_SOFT_
114a0 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20  HEAP_LIMIT: {.  
114b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
114c0 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  N;.    if( zRigh
114d0 74 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  t && sqlite3DecO
114e0 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
114f0 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
11500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11510 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
11520 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20  t64(N);.    }.  
11530 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
11540 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66  t(v, sqlite3_sof
11550 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d  t_heap_limit64(-
11560 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
11570 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
11580 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a   PRAGMA threads.
11590 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68    **   PRAGMA th
115a0 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20  reads = N.  **. 
115b0 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68   ** Configure th
115c0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
115d0 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
115e0 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ds.  Return the 
115f0 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  new.  ** maximum
11600 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  , which might be
11610 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75 65   less than reque
11620 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  sted..  */.  cas
11630 65 20 50 72 61 67 54 79 70 5f 54 48 52 45 41 44  e PragTyp_THREAD
11640 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S: {.    sqlite3
11650 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66  _int64 N;.    if
11660 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26  ( zRight.     &&
11670 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
11680 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e  ToI64(zRight, &N
11690 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
116a0 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b    && N>=0.    ){
116b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
116c0 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  imit(db, SQLITE_
116d0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
116e0 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78  EADS, (int)(N&0x
116f0 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20  7fffffff));.    
11700 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
11710 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
11720 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54  _limit(db, SQLIT
11730 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
11740 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20  HREADS, -1));.  
11750 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
11760 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11770 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
11780 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
11790 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74    /*.  ** Report
117a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
117b0 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20  te of file logs 
117c0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
117d0 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  s.  */.  case Pr
117e0 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55  agTyp_LOCK_STATU
117f0 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  S: {.    static 
11800 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
11810 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d  t azLockName[] =
11820 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b   {.      "unlock
11830 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22  ed", "shared", "
11840 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64  reserved", "pend
11850 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65  ing", "exclusive
11860 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
11870 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
11880 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f  nMem = 2;.    fo
11890 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
118a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
118b0 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20  ree *pBt;.      
118c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
118d0 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  te = "unknown";.
118e0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
118f0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
11900 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20  ].zDbSName==0 ) 
11910 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11920 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11930 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11940 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  pBt==0 || sqlite
11950 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
11960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
11970 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22  State = "closed"
11980 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11990 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  ( sqlite3_file_c
119a0 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64  ontrol(db, i ? d
119b0 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
119c0 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20  me : 0, .       
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
119f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
11a00 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54  TATE, &j)==SQLIT
11a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11a20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b   zState = azLock
11a30 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  Name[j];.      }
11a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11a50 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
11a60 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b  , "ss", db->aDb[
11a70 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74  i].zDbSName, zSt
11a80 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ate);.    }.    
11a90 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
11aa0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
11ab0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 63 61 73  _HAS_CODEC.  cas
11ac0 65 20 50 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b  e PragTyp_KEY: {
11ad0 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
11ae0 29 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32  ) sqlite3_key_v2
11af0 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74  (db, zDb, zRight
11b00 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
11b10 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  0(zRight));.    
11b20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73  break;.  }.  cas
11b30 65 20 50 72 61 67 54 79 70 5f 52 45 4b 45 59 3a  e PragTyp_REKEY:
11b40 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
11b50 74 20 29 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  t ) sqlite3_reke
11b60 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52  y_v2(db, zDb, zR
11b70 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72  ight, sqlite3Str
11b80 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a  len30(zRight));.
11b90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
11ba0 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 48 45   case PragTyp_HE
11bb0 58 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  XKEY: {.    if( 
11bc0 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
11bd0 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20  u8 iByte;.      
11be0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61  int i;.      cha
11bf0 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20  r zKey[40];.    
11c00 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65    for(i=0, iByte
11c10 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65  =0; i<sizeof(zKe
11c20 79 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49  y)*2 && sqlite3I
11c30 73 78 64 69 67 69 74 28 7a 52 69 67 68 74 5b 69  sxdigit(zRight[i
11c40 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
11c50 20 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65    iByte = (iByte
11c60 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65  <<4) + sqlite3He
11c70 78 54 6f 49 6e 74 28 7a 52 69 67 68 74 5b 69 5d  xToInt(zRight[i]
11c80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
11c90 69 26 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69  i&1)!=0 ) zKey[i
11ca0 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20  /2] = iByte;.   
11cb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
11cc0 7a 4c 65 66 74 5b 33 5d 20 26 20 30 78 66 29 3d  zLeft[3] & 0xf)=
11cd0 3d 30 78 62 20 29 7b 0a 20 20 20 20 20 20 20 20  =0xb ){.        
11ce0 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64  sqlite3_key_v2(d
11cf0 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f  b, zDb, zKey, i/
11d00 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
11d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11d20 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  _rekey_v2(db, zD
11d30 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20  b, zKey, i/2);. 
11d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11d50 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
11d60 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
11d70 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
11d80 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
11d90 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 29  TE_ENABLE_CEROD)
11da0 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
11db0 41 43 54 49 56 41 54 45 5f 45 58 54 45 4e 53 49  ACTIVATE_EXTENSI
11dc0 4f 4e 53 3a 20 69 66 28 20 7a 52 69 67 68 74 20  ONS: if( zRight 
11dd0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
11de0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69  _HAS_CODEC.    i
11df0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
11e00 6d 70 28 7a 52 69 67 68 74 2c 20 22 73 65 65 2d  mp(zRight, "see-
11e10 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 4)==0 ){.    
11e20 20 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61    sqlite3_activa
11e30 74 65 5f 73 65 65 28 26 7a 52 69 67 68 74 5b 34  te_see(&zRight[4
11e40 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ]);.    }.#endif
11e50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11e60 4e 41 42 4c 45 5f 43 45 52 4f 44 0a 20 20 20 20  NABLE_CEROD.    
11e70 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
11e80 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 63 65 72  Cmp(zRight, "cer
11e90 6f 64 2d 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20  od-", 6)==0 ){. 
11ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74       sqlite3_act
11eb0 69 76 61 74 65 5f 63 65 72 6f 64 28 26 7a 52 69  ivate_cerod(&zRi
11ec0 67 68 74 5b 36 5d 29 3b 0a 20 20 20 20 7d 0a 23  ght[6]);.    }.#
11ed0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61  endif.  }.  brea
11ee0 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 20 2f  k;.#endif..  } /
11ef0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 50 52 41  * End of the PRA
11f00 47 4d 41 20 73 77 69 74 63 68 20 2a 2f 0a 0a 20  GMA switch */.. 
11f10 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
11f20 67 20 62 6c 6f 63 6b 20 69 73 20 61 20 6e 6f 2d  g block is a no-
11f30 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45  op unless SQLITE
11f40 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
11f50 64 2e 20 49 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a  d. Its only.  **
11f60 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65   purpose is to e
11f70 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
11f80 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 76 65  statements to ve
11f90 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 65  rify that if the
11fa0 0a 20 20 2a 2a 20 50 72 61 67 46 6c 67 5f 4e 6f  .  ** PragFlg_No
11fb0 43 6f 6c 75 6d 6e 73 31 20 66 6c 61 67 20 69 73  Columns1 flag is
11fc0 20 73 65 74 20 61 6e 64 20 74 68 65 20 63 61 6c   set and the cal
11fd0 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e  ler specified an
11fe0 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74   argument.  ** t
11ff0 6f 20 74 68 65 20 50 52 41 47 4d 41 2c 20 74 68  o the PRAGMA, th
12000 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
12010 20 68 61 73 20 6e 6f 74 20 61 64 64 65 64 20 61   has not added a
12020 6e 79 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  ny OP_ResultRow 
12030 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
12040 6e 73 20 74 6f 20 74 68 65 20 56 4d 2e 20 20 2a  ns to the VM.  *
12050 2f 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61  /.  if( (pPragma
12060 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61  ->mPragFlg & Pra
12070 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29  gFlg_NoColumns1)
12080 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20   && zRight ){.  
12090 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72    sqlite3VdbeVer
120a0 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 76  ifyNoResultRow(v
120b0 29 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f  );.  }..pragma_o
120c0 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ut:.  sqlite3DbF
120d0 72 65 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a  ree(db, zLeft);.
120e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
120f0 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 23  db, zRight);.}.#
12100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12110 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12120 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
12130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12170 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
12180 20 6f 66 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73   of an eponymous
12190 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
121a0 68 61 74 20 72 75 6e 73 20 61 20 70 72 61 67 6d  hat runs a pragm
121b0 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66  a..**.*/.typedef
121c0 20 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74   struct PragmaVt
121d0 61 62 20 50 72 61 67 6d 61 56 74 61 62 3b 0a 74  ab PragmaVtab;.t
121e0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72  ypedef struct Pr
121f0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 50  agmaVtabCursor P
12200 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 3b  ragmaVtabCursor;
12210 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74  .struct PragmaVt
12220 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ab {.  sqlite3_v
12230 74 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20  tab base;       
12240 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20   /* Base class. 
12250 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
12260 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12280 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
12290 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 77 68 69 63  nnection to whic
122a0 68 20 69 74 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  h it belongs */.
122b0 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61    const PragmaNa
122c0 6d 65 20 2a 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e  me *pName;  /* N
122d0 61 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d  ame of the pragm
122e0 61 20 2a 2f 0a 20 20 75 38 20 6e 48 69 64 64 65  a */.  u8 nHidde
122f0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
12300 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69   /* Number of hi
12310 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  dden columns */.
12320 20 20 75 38 20 69 48 69 64 64 65 6e 3b 20 20 20    u8 iHidden;   
12330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12340 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
12350 74 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20  t hidden column 
12360 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 50 72 61  */.};.struct Pra
12370 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 7b 0a  gmaVtabCursor {.
12380 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
12390 75 72 73 6f 72 20 62 61 73 65 3b 20 2f 2a 20 42  ursor base; /* B
123a0 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
123b0 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
123c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72  qlite3_stmt *pPr
123d0 61 67 6d 61 3b 20 20 20 20 2f 2a 20 54 68 65 20  agma;    /* The 
123e0 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74  pragma statement
123f0 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 73 71 6c   to run */.  sql
12400 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  ite_int64 iRowid
12410 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  ;      /* Curren
12420 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61  t rowid */.  cha
12430 72 20 2a 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20  r *azArg[2];    
12440 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
12450 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  of the argument 
12460 61 6e 64 20 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b  and schema */.};
12470 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20  ../* .** Pragma 
12480 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
12490 64 75 6c 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65  dule xConnect me
124a0 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
124b0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6f  int pragmaVtabCo
124c0 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  nnect(.  sqlite3
124d0 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41   *db,.  void *pA
124e0 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  ux,.  int argc, 
124f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
12500 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  t*argv,.  sqlite
12510 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
12520 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
12530 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d  ){.  const Pragm
12540 61 4e 61 6d 65 20 2a 70 50 72 61 67 6d 61 20 3d  aName *pPragma =
12550 20 28 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61   (const PragmaNa
12560 6d 65 2a 29 70 41 75 78 3b 0a 20 20 50 72 61 67  me*)pAux;.  Prag
12570 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 30  maVtab *pTab = 0
12580 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
12590 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
125a0 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 53 74 72  Sep = '(';.  Str
125b0 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61  Accum acc;.  cha
125c0 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20  r zBuf[200];..  
125d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
125e0 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44  (argc);.  UNUSED
125f0 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29  _PARAMETER(argv)
12600 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
12610 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c  cumInit(&acc, 0,
12620 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42   zBuf, sizeof(zB
12630 75 66 29 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  uf), 0);.  sqlit
12640 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
12650 41 6c 6c 28 26 61 63 63 2c 20 22 43 52 45 41 54  All(&acc, "CREAT
12660 45 20 54 41 42 4c 45 20 78 22 29 3b 0a 20 20 66  E TABLE x");.  f
12670 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d  or(i=0, j=pPragm
12680 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69  a->iPragCName; i
12690 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43  <pPragma->nPragC
126a0 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  Name; i++, j++){
126b0 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69  .    sqlite3XPri
126c0 6e 74 66 28 26 61 63 63 2c 20 22 25 63 5c 22 25  ntf(&acc, "%c\"%
126d0 73 5c 22 22 2c 20 63 53 65 70 2c 20 70 72 61 67  s\"", cSep, prag
126e0 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20 20 20 63  CName[j]);.    c
126f0 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20  Sep = ',';.  }. 
12700 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
12710 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
12720 26 61 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c  &acc, "(\"%s\"",
12730 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29   pPragma->zName)
12740 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27  ;.    cSep = ','
12750 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  ;.    i++;.  }. 
12760 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50   j = 0;.  if( pP
12770 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
12780 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74  & PragFlg_Result
12790 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
127a0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
127b0 6c 28 26 61 63 63 2c 20 22 2c 61 72 67 20 48 49  l(&acc, ",arg HI
127c0 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b  DDEN");.    j++;
127d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 61 67  .  }.  if( pPrag
127e0 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 28  ma->mPragFlg & (
127f0 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70  PragFlg_SchemaOp
12800 74 7c 50 72 61 67 46 6c 67 5f 53 63 68 65 6d 61  t|PragFlg_Schema
12810 52 65 71 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Req) ){.    sqli
12820 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
12830 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c 73 63 68  dAll(&acc, ",sch
12840 65 6d 61 20 48 49 44 44 45 4e 22 29 3b 0a 20 20  ema HIDDEN");.  
12850 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c    j++;.  }.  sql
12860 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
12870 6e 64 28 26 61 63 63 2c 20 22 29 22 2c 20 31 29  nd(&acc, ")", 1)
12880 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
12890 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b  cumFinish(&acc);
128a0 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65  .  assert( strle
128b0 6e 28 7a 42 75 66 29 20 3c 20 73 69 7a 65 6f 66  n(zBuf) < sizeof
128c0 28 7a 42 75 66 29 2d 31 20 29 3b 0a 20 20 72 63  (zBuf)-1 );.  rc
128d0 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
128e0 72 65 5f 76 74 61 62 28 64 62 2c 20 7a 42 75 66  re_vtab(db, zBuf
128f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54  ITE_OK ){.    pT
12910 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
12920 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
12930 28 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74  (sizeof(PragmaVt
12940 61 62 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ab));.    if( pT
12950 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ab==0 ){.      r
12960 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
12970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12980 20 20 20 6d 65 6d 73 65 74 28 70 54 61 62 2c 20     memset(pTab, 
12990 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d 61  0, sizeof(Pragma
129a0 56 74 61 62 29 29 3b 0a 20 20 20 20 20 20 70 54  Vtab));.      pT
129b0 61 62 2d 3e 70 4e 61 6d 65 20 3d 20 70 50 72 61  ab->pName = pPra
129c0 67 6d 61 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  gma;.      pTab-
129d0 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  >db = db;.      
129e0 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 20 3d 20  pTab->iHidden = 
129f0 69 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  i;.      pTab->n
12a00 48 69 64 64 65 6e 20 3d 20 6a 3b 0a 20 20 20 20  Hidden = j;.    
12a10 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  }.  }else{.    *
12a20 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
12a30 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
12a40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
12a50 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61  );.  }..  *ppVta
12a60 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
12a70 62 2a 29 70 54 61 62 3b 0a 20 20 72 65 74 75 72  b*)pTab;.  retur
12a80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
12a90 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
12aa0 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 44 69 73  able module xDis
12ab0 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a  connect method..
12ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
12ad0 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65  agmaVtabDisconne
12ae0 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ct(sqlite3_vtab 
12af0 2a 70 56 74 61 62 29 7b 0a 20 20 50 72 61 67 6d  *pVtab){.  Pragm
12b00 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50  aVtab *pTab = (P
12b10 72 61 67 6d 61 56 74 61 62 2a 29 70 56 74 61 62  ragmaVtab*)pVtab
12b20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
12b30 28 70 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pTab);.  return
12b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12b50 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
12b60 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75   best index to u
12b70 73 65 20 74 6f 20 73 65 61 72 63 68 20 61 20 70  se to search a p
12b80 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
12b90 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ble..**.** There
12ba0 20 61 72 65 20 6e 6f 74 20 72 65 61 6c 6c 79 20   are not really 
12bb0 61 6e 79 20 69 6e 64 65 78 20 63 68 6f 69 63 65  any index choice
12bc0 73 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74 20  s.  But we want 
12bd0 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65  to encourage the
12be0 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  .** query planne
12bf0 72 20 74 6f 20 67 69 76 65 20 3d 3d 20 63 6f 6e  r to give == con
12c00 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 73 20 6d  straints on as m
12c10 61 6e 79 20 68 69 64 64 65 6e 20 70 61 72 61 6d  any hidden param
12c20 65 74 65 72 73 20 61 73 0a 2a 2a 20 70 6f 73 73  eters as.** poss
12c30 69 62 6c 65 2c 20 61 6e 64 20 65 73 70 65 63 69  ible, and especi
12c40 61 6c 6c 79 20 6f 6e 20 74 68 65 20 66 69 72 73  ally on the firs
12c50 74 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74  t hidden paramet
12c60 65 72 2e 20 20 53 6f 20 72 65 74 75 72 6e 20 61  er.  So return a
12c70 0a 2a 2a 20 68 69 67 68 20 63 6f 73 74 20 69 66  .** high cost if
12c80 20 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65   hidden paramete
12c90 72 73 20 61 72 65 20 75 6e 63 6f 6e 73 74 72 61  rs are unconstra
12ca0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
12cb0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 42 65  int pragmaVtabBe
12cc0 73 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f  stIndex(sqlite3_
12cd0 76 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74  vtab *tab, sqlit
12ce0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12cf0 49 64 78 49 6e 66 6f 29 7b 0a 20 20 50 72 61 67  IdxInfo){.  Prag
12d00 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20 28  maVtab *pTab = (
12d10 50 72 61 67 6d 61 56 74 61 62 2a 29 74 61 62 3b  PragmaVtab*)tab;
12d20 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
12d30 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
12d40 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74  nstraint *pConst
12d50 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  raint;.  int i, 
12d60 6a 3b 0a 20 20 69 6e 74 20 73 65 65 6e 5b 32 5d  j;.  int seen[2]
12d70 3b 0a 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  ;..  pIdxInfo->e
12d80 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
12d90 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20  double)1;.  if( 
12da0 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30  pTab->nHidden==0
12db0 20 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ){ return SQLIT
12dc0 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43 6f 6e 73 74  E_OK; }.  pConst
12dd0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
12de0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
12df0 20 73 65 65 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20   seen[0] = 0;.  
12e00 73 65 65 6e 5b 31 5d 20 3d 20 30 3b 0a 20 20 66  seen[1] = 0;.  f
12e10 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
12e20 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
12e30 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e   i++, pConstrain
12e40 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43  t++){.    if( pC
12e50 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c  onstraint->usabl
12e60 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
12e70 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72  .    if( pConstr
12e80 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45  aint->op!=SQLITE
12e90 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
12ea0 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b  T_EQ ) continue;
12eb0 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72  .    if( pConstr
12ec0 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20  aint->iColumn < 
12ed0 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 20 29 20  pTab->iHidden ) 
12ee0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6a 20  continue;.    j 
12ef0 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  = pConstraint->i
12f00 43 6f 6c 75 6d 6e 20 2d 20 70 54 61 62 2d 3e 69  Column - pTab->i
12f10 48 69 64 64 65 6e 3b 0a 20 20 20 20 61 73 73 65  Hidden;.    asse
12f20 72 74 28 20 6a 20 3c 20 32 20 29 3b 0a 20 20 20  rt( j < 2 );.   
12f30 20 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a   seen[j] = i+1;.
12f40 20 20 7d 0a 20 20 69 66 28 20 73 65 65 6e 5b 30    }.  if( seen[0
12f50 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78  ]==0 ){.    pIdx
12f60 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
12f70 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 31  ost = (double)21
12f80 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20 70 49  47483647;.    pI
12f90 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
12fa0 64 52 6f 77 73 20 3d 20 32 31 34 37 34 38 33 36  dRows = 21474836
12fb0 34 37 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  47;.    return S
12fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
12fd0 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20  j = seen[0]-1;. 
12fe0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
12ff0 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61  traintUsage[j].a
13000 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
13010 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13020 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d  raintUsage[j].om
13030 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 73 65  it = 1;.  if( se
13040 65 6e 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72  en[1]==0 ) retur
13050 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
13060 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
13070 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
13080 29 32 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  )20;.  pIdxInfo-
13090 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
130a0 20 32 30 3b 0a 20 20 6a 20 3d 20 73 65 65 6e 5b   20;.  j = seen[
130b0 31 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f  1]-1;.  pIdxInfo
130c0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
130d0 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[j].argvIndex 
130e0 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 2;.  pIdxInfo-
130f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13100 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  e[j].omit = 1;. 
13110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13120 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20  K;.}../* Create 
13130 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
13140 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72 74   the pragma virt
13150 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61  ual table */.sta
13160 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13170 61 62 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  abOpen(sqlite3_v
13180 74 61 62 20 2a 70 56 74 61 62 2c 20 73 71 6c 69  tab *pVtab, sqli
13190 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
131a0 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 50  **ppCursor){.  P
131b0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20  ragmaVtabCursor 
131c0 2a 70 43 73 72 3b 0a 20 20 70 43 73 72 20 3d 20  *pCsr;.  pCsr = 
131d0 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
131e0 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  r*)sqlite3_mallo
131f0 63 28 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 29  c(sizeof(*pCsr))
13200 3b 0a 20 20 69 66 28 20 70 43 73 72 3d 3d 30 20  ;.  if( pCsr==0 
13210 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13220 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
13230 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCsr, 0, sizeof(
13240 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13250 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73 65  ));.  pCsr->base
13260 2e 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a  .pVtab = pVtab;.
13270 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70    *ppCursor = &p
13280 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74  Csr->base;.  ret
13290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
132a0 0a 0a 2f 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  ../* Clear all c
132b0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 72 61 67  ontent from prag
132c0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
132d0 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 73 74 61 74   cursor. */.stat
132e0 69 63 20 76 6f 69 64 20 70 72 61 67 6d 61 56 74  ic void pragmaVt
132f0 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 50 72  abCursorClear(Pr
13300 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
13310 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCsr){.  int i;.
13320 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
13330 7a 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61  ze(pCsr->pPragma
13340 29 3b 0a 20 20 70 43 73 72 2d 3e 70 50 72 61 67  );.  pCsr->pPrag
13350 6d 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ma = 0;.  for(i=
13360 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  0; i<ArraySize(p
13370 43 73 72 2d 3e 61 7a 41 72 67 29 3b 20 69 2b 2b  Csr->azArg); i++
13380 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13390 72 65 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 5b  ree(pCsr->azArg[
133a0 69 5d 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61  i]);.    pCsr->a
133b0 7a 41 72 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  zArg[i] = 0;.  }
133c0 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20 61 20 70  .}../* Close a p
133d0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
133e0 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 73 74  ble cursor */.st
133f0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
13400 74 61 62 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  tabClose(sqlite3
13410 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
13420 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
13430 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
13440 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13450 2a 29 63 75 72 3b 0a 20 20 70 72 61 67 6d 61 56  *)cur;.  pragmaV
13460 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70  tabCursorClear(p
13470 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Csr);.  sqlite3_
13480 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65  free(pCsr);.  re
13490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
134a0 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74 68  }../* Advance th
134b0 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  e pragma virtual
134c0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f   table cursor to
134d0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f   the next row */
134e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
134f0 6d 61 56 74 61 62 4e 65 78 74 28 73 71 6c 69 74  maVtabNext(sqlit
13500 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
13510 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20  pVtabCursor){.  
13520 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13530 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
13540 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
13550 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72  bCursor;.  int r
13560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13570 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
13580 68 65 20 78 52 6f 77 69 64 20 76 61 6c 75 65 20  he xRowid value 
13590 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52 6f 77 69  */.  pCsr->iRowi
135a0 64 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d++;.  assert( p
135b0 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 29 3b 0a  Csr->pPragma );.
135c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
135d0 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  !=sqlite3_step(p
135e0 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 20 29 7b  Csr->pPragma) ){
135f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13600 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d  3_finalize(pCsr-
13610 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 70  >pPragma);.    p
13620 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30  Csr->pPragma = 0
13630 3b 0a 20 20 20 20 70 72 61 67 6d 61 56 74 61 62  ;.    pragmaVtab
13640 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72  CursorClear(pCsr
13650 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13660 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  rc;.}../* .** Pr
13670 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
13680 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69 6c 74 65  le module xFilte
13690 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  r method..*/.sta
136a0 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
136b0 61 62 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69  abFilter(.  sqli
136c0 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
136d0 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20  *pVtabCursor, . 
136e0 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e   int idxNum, con
136f0 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c  st char *idxStr,
13700 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  .  int argc, sql
13710 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
13720 76 0a 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  v.){.  PragmaVta
13730 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
13740 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
13750 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
13760 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
13770 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
13780 2a 29 28 70 56 74 61 62 43 75 72 73 6f 72 2d 3e  *)(pVtabCursor->
13790 70 56 74 61 62 29 3b 0a 20 20 69 6e 74 20 72 63  pVtab);.  int rc
137a0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
137b0 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20  StrAccum acc;.  
137c0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55  char *zSql;..  U
137d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
137e0 69 64 78 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45  idxNum);.  UNUSE
137f0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78 53  D_PARAMETER(idxS
13800 74 72 29 3b 0a 20 20 70 72 61 67 6d 61 56 74 61  tr);.  pragmaVta
13810 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73  bCursorClear(pCs
13820 72 29 3b 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d  r);.  j = (pTab-
13830 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67  >pName->mPragFlg
13840 20 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c   & PragFlg_Resul
13850 74 31 29 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a  t1)!=0 ? 0 : 1;.
13860 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
13870 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  c; i++, j++){.  
13880 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
13890 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
138a0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
138b0 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a  _text(argv[i]);.
138c0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 41 72      assert( j<Ar
138d0 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a  raySize(pCsr->az
138e0 41 72 67 29 20 29 3b 0a 20 20 20 20 61 73 73 65  Arg) );.    asse
138f0 72 74 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  rt( pCsr->azArg[
13900 6a 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  j]==0 );.    if(
13910 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20   zText ){.      
13920 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d  pCsr->azArg[j] =
13930 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13940 28 22 25 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20  ("%s", zText);. 
13950 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 61       if( pCsr->a
13960 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20  zArg[j]==0 ){.  
13970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13980 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
13990 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
139a0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
139b0 69 74 28 26 61 63 63 2c 20 30 2c 20 30 2c 20 30  it(&acc, 0, 0, 0
139c0 2c 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d  , pTab->db->aLim
139d0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
139e0 53 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20  SQL_LENGTH]);.  
139f0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
13a00 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22  ppendAll(&acc, "
13a10 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28  PRAGMA ");.  if(
13a20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20   pCsr->azArg[1] 
13a30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
13a40 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25 51 2e  rintf(&acc, "%Q.
13a50 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  ", pCsr->azArg[1
13a60 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
13a70 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
13a80 6c 6c 28 26 61 63 63 2c 20 70 54 61 62 2d 3e 70  ll(&acc, pTab->p
13a90 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Name->zName);.  
13aa0 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  if( pCsr->azArg[
13ab0 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  0] ){.    sqlite
13ac0 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22  3XPrintf(&acc, "
13ad0 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72  =%Q", pCsr->azAr
13ae0 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71  g[0]);.  }.  zSq
13af0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  l = sqlite3StrAc
13b00 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b  cumFinish(&acc);
13b10 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
13b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13b30 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OMEM;.  rc = sql
13b40 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
13b50 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  pTab->db, zSql, 
13b60 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67  -1, &pCsr->pPrag
13b70 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ma, 0);.  sqlite
13b80 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
13b90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13ba0 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62  K ){.    pTab->b
13bb0 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
13bc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13bd0 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
13be0 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20  sg(pTab->db));. 
13bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13c00 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d  }.  return pragm
13c10 61 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43  aVtabNext(pVtabC
13c20 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
13c30 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
13c40 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f  table module xEo
13c50 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  f method..*/.sta
13c60 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13c70 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  abEof(sqlite3_vt
13c80 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
13c90 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
13ca0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13cb0 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13cc0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
13cd0 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43  or;.  return (pC
13ce0 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b  sr->pPragma==0);
13cf0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75  .}../* The xColu
13d00 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79  mn method simply
13d10 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72   returns the cor
13d20 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
13d30 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52  n from.** the PR
13d40 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  AGMA.  .*/.stati
13d50 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
13d60 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
13d70 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
13d80 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73  VtabCursor, .  s
13d90 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
13da0 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b  ctx, .  int i.){
13db0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13dc0 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13dd0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13de0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72  VtabCursor;.  Pr
13df0 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
13e00 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70   (PragmaVtab*)(p
13e10 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
13e20 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62  b);.  if( i<pTab
13e30 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20  ->iHidden ){.   
13e40 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
13e50 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74  value(ctx, sqlit
13e60 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
13e70 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69  pCsr->pPragma, i
13e80 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
13e90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
13ea0 74 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e  text(ctx, pCsr->
13eb0 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48  azArg[i-pTab->iH
13ec0 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45  idden],-1,SQLITE
13ed0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
13ee0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13ef0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50  _OK;.}../* .** P
13f00 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
13f10 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69  ble module xRowi
13f20 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  d method..*/.sta
13f30 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13f40 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  abRowid(sqlite3_
13f50 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
13f60 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65  abCursor, sqlite
13f70 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72  _int64 *p){.  Pr
13f80 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
13f90 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
13fa0 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
13fb0 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43  ursor;.  *p = pC
13fc0 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65  sr->iRowid;.  re
13fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13fe0 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61  }../* The pragma
13ff0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
14000 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20  bject */.static 
14010 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
14020 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d  dule pragmaVtabM
14030 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20  odule = {.  0,  
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
14060 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
14090 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62  e - create a tab
140a0 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
140b0 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  abConnect,      
140c0 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
140d0 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e   - connect to an
140e0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
140f0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42  */.  pragmaVtabB
14100 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
14110 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
14120 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72  - Determine sear
14130 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  ch strategy */. 
14140 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
14150 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
14160 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44   xDisconnect - D
14170 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61  isconnect from a
14180 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20   table */.  0,  
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
141b0 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61  troy - Drop a ta
141c0 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ble */.  pragmaV
141d0 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  tabOpen,        
141e0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
141f0 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
14200 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c  /.  pragmaVtabCl
14210 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
14220 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
14230 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
14240 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65   pragmaVtabFilte
14250 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
14260 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
14270 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
14280 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d  aints */.  pragm
14290 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20  aVtabNext,      
142a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
142b0 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
142c0 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
142d0 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20  tabEof,         
142e0 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f        /* xEof */
142f0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c  .  pragmaVtabCol
14300 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
14310 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
14320 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67  d data */.  prag
14330 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20  maVtabRowid,    
14340 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
14350 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
14360 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72   /* xUpdate - wr
14390 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c  ite data */.  0,
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
143c0 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61  egin - begin tra
143d0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
14400 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73  ync - sync trans
14410 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d           /* xCom
14440 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61  mit - commit tra
14450 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
14480 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61  ollback - rollba
14490 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  ck transaction *
144a0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f   /* xFindFunctio
144d0 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  n - function ove
144e0 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c  rloading */.  0,
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
14510 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74  ename - rename t
14520 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c  he table */.  0,
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
14550 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c  avepoint */.  0,
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
14580 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20  elease */.  0   
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
145b0 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  lbackTo */.};../
145c0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
145d0 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73  e if zTabName is
145e0 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65   really the name
145f0 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49   of a pragma.  I
14600 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e  f it is,.** then
14610 20 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f   register an epo
14620 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
14630 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72  able for that pr
14640 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a  agma and return.
14650 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
14660 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63  the Module objec
14670 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  t for the new vi
14680 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
14690 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50  Module *sqlite3P
146a0 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65  ragmaVtabRegiste
146b0 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  r(sqlite3 *db, c
146c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
146d0 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d  ){.  const Pragm
146e0 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20  aName *pName;.  
146f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14700 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  strnicmp(zName, 
14710 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30  "pragma_", 7)==0
14720 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72   );.  pName = pr
14730 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65  agmaLocate(zName
14740 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  +7);.  if( pName
14750 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14760 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50    if( (pName->mP
14770 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c  ragFlg & (PragFl
14780 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c  g_Result0|PragFl
14790 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29  g_Result1))==0 )
147a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
147b0 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
147c0 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
147d0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a  e, zName)==0 );.
147e0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
147f0 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65  VtabCreateModule
14800 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61  (db, zName, &pra
14810 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28  gmaVtabModule, (
14820 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b  void*)pName, 0);
14830 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
14840 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14850 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69  LTABLE */..#endi
14860 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14870 5f 50 52 41 47 4d 41 20 2a 2f 0a                 _PRAGMA */.