/ Hex Artifact Content
Login

Artifact 8a35509e8f60746fbdcde5312ddfd177c46c7e9c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61  ** Process a pra
23a0: 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  gma statement.  
23b0: 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61  .**.** Pragmas a
23c0: 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a  re of this form:
23d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47  .**.**      PRAG
23e0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20 5b  MA [schema.]id [
23f0: 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20 54  = value].**.** T
2400: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69  he identifier mi
2410: 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74  ght also be a st
2420: 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65  ring.  The value
2430: 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e   is a string, an
2440: 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c  d.** identifier,
2450: 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49   or a number.  I
2460: 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74  f minusFlag is t
2470: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61  rue, then the va
2480: 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62  lue is.** a numb
2490: 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63  er that was prec
24a0: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
24b0: 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sign..**.** If t
24c0: 68 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20  he left side is 
24d0: 22 64 61 74 61 62 61 73 65 2e 69 64 22 20 74 68  "database.id" th
24e0: 65 6e 20 70 49 64 31 20 69 73 20 74 68 65 20 64  en pId1 is the d
24f0: 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20  atabase name.** 
2500: 61 6e 64 20 70 49 64 32 20 69 73 20 74 68 65 20  and pId2 is the 
2510: 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65 66 74  id.  If the left
2520: 20 73 69 64 65 20 69 73 20 6a 75 73 74 20 22 69   side is just "i
2530: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
2540: 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20 70 49  the.** id and pI
2550: 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74 79 20  d2 is any empty 
2560: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  string..*/.void 
2570: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 0a 20  sqlite3Pragma(. 
2580: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2590: 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31 2c 20  .  Token *pId1, 
25a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25b0: 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e  part of [schema.
25c0: 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20 54  ]id field */.  T
25d0: 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20 20 20  oken *pId2,     
25e0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
25f0: 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d 69 64  t of [schema.]id
2600: 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c 4c 20   field, or NULL 
2610: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56 61 6c  */.  Token *pVal
2620: 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ue,      /* Toke
2630: 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c 20 6f  n for <value>, o
2640: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
2650: 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20 20 20  minusFlag       
2660: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27 2d 27  /* True if a '-'
2670: 20 73 69 67 6e 20 70 72 65 63 65 64 65 64 20 3c   sign preceded <
2680: 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20 20 63  value> */.){.  c
2690: 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 20  har *zLeft = 0; 
26a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
26b0: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
26c0: 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20 20 63  ring <id> */.  c
26d0: 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b  har *zRight = 0;
26e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
26f0: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
2700: 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20 6f 72  ring <value>, or
2710: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
2720: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
2730: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
2740: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65  e name */.  Toke
2750: 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  n *pId;         
2760: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2770: 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f 0a 20   <id> token */. 
2780: 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b 34 5d   char *aFcntl[4]
2790: 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ;       /* Argum
27a0: 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 43  ent to SQLITE_FC
27b0: 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20  NTL_PRAGMA */.  
27c0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
27d0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
27e0: 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c 64 61  se index for <da
27f0: 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69 6e 74  tabase> */.  int
2800: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 74            /* ret
2820: 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d 20 53  urn value form S
2830: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47  QLITE_FCNTL_PRAG
2840: 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  MA */.  sqlite3 
2850: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2860: 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ;    /* The data
2870: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2880: 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  */.  Db *pDb;   
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
28b0: 63 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  c database being
28c0: 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20 20 56   pragmaed */.  V
28d0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
28e0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
28f0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
2900: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
2910: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
2920: 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54 68 65  Pragma;   /* The
2930: 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20 69 66   pragma */..  if
2940: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
2950: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  .  sqlite3VdbeRu
2960: 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a 20 20  nOnlyOnce(v);.  
2970: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
2980: 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70 72 65  ;..  /* Interpre
2990: 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e 5d 20  t the [schema.] 
29a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
29b0: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 69 44  ma statement. iD
29c0: 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e  b is the.  ** in
29d0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
29e0: 61 73 65 20 74 68 69 73 20 70 72 61 67 6d 61 20  ase this pragma 
29f0: 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69 65 64  is being applied
2a00: 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b 5d 2e   to in db.aDb[].
2a10: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
2a20: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
2a30: 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70 49 64  Parse, pId1, pId
2a40: 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66 28 20  2, &pId);.  if( 
2a50: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
2a60: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
2a70: 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20  [iDb];..  /* If 
2a80: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
2a90: 65 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69  e has been expli
2aa0: 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73 20 70  citly named as p
2ab0: 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  art of the .  **
2ac0: 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20 73 75   pragma, make su
2ad0: 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 0a  re it is open. .
2ae0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62 3d 3d    */.  if( iDb==
2af0: 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70 65 6e  1 && sqlite3Open
2b00: 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
2b10: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
2b20: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65 66 74  rn;.  }..  zLeft
2b30: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
2b40: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49 64 29  omToken(db, pId)
2b50: 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74 20 29  ;.  if( !zLeft )
2b60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
2b70: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
2b80: 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  zRight = sqlite3
2b90: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d 25 54  MPrintf(db, "-%T
2ba0: 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 65  ", pValue);.  }e
2bb0: 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20  lse{.    zRight 
2bc0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
2bd0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61 6c 75  mToken(db, pValu
2be0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  e);.  }..  asser
2bf0: 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a 44 62  t( pId2 );.  zDb
2c00: 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f 20 70   = pId2->n>0 ? p
2c10: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a 20 30  Db->zDbSName : 0
2c20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
2c30: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2c40: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 2c 20   SQLITE_PRAGMA, 
2c50: 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c 20 7a  zLeft, zRight, z
2c60: 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  Db) ){.    goto 
2c70: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
2c80: 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20 53 51  .  /* Send an SQ
2c90: 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d  LITE_FCNTL_PRAGM
2ca0: 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 74  A file-control t
2cb0: 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  o the underlying
2cc0: 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63   VFS.  ** connec
2cd0: 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72 65 74  tion.  If it ret
2ce0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  urns SQLITE_OK, 
2cf0: 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 61 74  then assume that
2d00: 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20 68 61   the VFS.  ** ha
2d10: 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67 6d 61  ndled the pragma
2d20: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20   and generate a 
2d30: 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64 20 73  no-op prepared s
2d40: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a 0a 20  tatement..  **. 
2d50: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
2d60: 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38 2d 35  ON-OF: R-12238-5
2d70: 35 31 32 30 20 57 68 65 6e 65 76 65 72 20 61 20  5120 Whenever a 
2d80: 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65 6e 74  PRAGMA statement
2d90: 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20 2a 2a   is parsed,.  **
2da0: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2db0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63 6f 6e  _PRAGMA file con
2dc0: 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74 6f 20  trol is sent to 
2dd0: 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74 65 33  the open sqlite3
2de0: 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a 65 63  _file.  ** objec
2df0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
2e00: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2e10: 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68  file to which th
2e20: 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20 73 74  e pragma.  ** st
2e30: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73 2e 0a  atement refers..
2e40: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2e50: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32  ENTATION-OF: R-2
2e60: 39 38 37 35 2d 33 31 36 37 38 20 54 68 65 20 61  9875-31678 The a
2e70: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 53  rgument to the S
2e80: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47  QLITE_FCNTL_PRAG
2e90: 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  MA.  ** file con
2ea0: 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72 61 79  trol is an array
2eb0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
2ec0: 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a 2a 29  strings (char**)
2ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a 20 20   in which the.  
2ee0: 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  ** second elemen
2ef0: 74 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69  t of the array i
2f00: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
2f10: 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74 68 65  e pragma and the
2f20: 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c 65 6d   third.  ** elem
2f30: 65 6e 74 20 69 73 20 74 68 65 20 61 72 67 75 6d  ent is the argum
2f40: 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61 67 6d  ent to the pragm
2f50: 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  a or NULL if the
2f60: 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f 0a 20   pragma has no. 
2f70: 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20   ** argument..  
2f80: 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d 20 3d  */.  aFcntl[0] =
2f90: 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31 5d 20   0;.  aFcntl[1] 
2fa0: 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63 6e 74  = zLeft;.  aFcnt
2fb0: 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b 0a 20  l[2] = zRight;. 
2fc0: 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30 3b 0a   aFcntl[3] = 0;.
2fd0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
2fe0: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 72  r.nBusy = 0;.  r
2ff0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
3000: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
3010: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
3020: 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29 61 46  RAGMA, (void*)aF
3030: 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d  cntl);.  if( rc=
3040: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
3060: 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20  NumCols(v, 1);. 
3070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
3080: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43  tColName(v, 0, C
3090: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61 46 63  OLNAME_NAME, aFc
30a0: 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45 5f 54  ntl[0], SQLITE_T
30b0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 72  RANSIENT);.    r
30c0: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
30d0: 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20  v, aFcntl[0]);. 
30e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30f0: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
3100: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
3110: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
3120: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
3130: 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e 74 6c  {.    if( aFcntl
3140: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
3150: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3160: 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63 6e 74  rse, "%s", aFcnt
3170: 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  l[0]);.      sql
3180: 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e 74 6c  ite3_free(aFcntl
3190: 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [0]);.    }.    
31a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
31b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
31c0: 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72   rc;.    goto pr
31d0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  agma_out;.  }.. 
31e0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 70   /* Locate the p
31f0: 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c 6f 6f  ragma in the loo
3200: 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  kup table */.  p
3210: 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d 61 4c  Pragma = pragmaL
3220: 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20  ocate(zLeft);.  
3230: 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30 20 29  if( pPragma==0 )
3240: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
3250: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
3260: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
3270: 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 20  chema is loaded 
3280: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 72 65  if the pragma re
3290: 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f 0a 20  quires that */. 
32a0: 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d   if( (pPragma->m
32b0: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
32c0: 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21 3d 30  g_NeedSchema)!=0
32d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
32e0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
32f0: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61  arse) ) goto pra
3300: 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  gma_out;.  }..  
3310: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
3320: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
3330: 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61 73 20  mes for pragmas 
3340: 74 68 61 74 20 72 65 74 75 72 6e 20 72 65 73 75  that return resu
3350: 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  lts */.  if( (pP
3360: 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
3370: 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  & PragFlg_NoColu
3380: 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26 20 28  mns)==0 .   && (
3390: 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
33a0: 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43  lg & PragFlg_NoC
33b0: 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a  olumns1)==0 || z
33c0: 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a 20  Right==0).  ){. 
33d0: 20 20 20 73 65 74 50 72 61 67 6d 61 52 65 73 75     setPragmaResu
33e0: 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c  ltColumnNames(v,
33f0: 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a   pPragma);.  }..
3400: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
3410: 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 72 61   appropriate pra
3420: 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20  gma handler */. 
3430: 20 73 77 69 74 63 68 28 20 70 50 72 61 67 6d 61   switch( pPragma
3440: 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a 20 20  ->ePragTyp ){.  
3450: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
3460: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3470: 50 52 41 47 4d 41 53 29 20 26 26 20 21 64 65 66  PRAGMAS) && !def
3480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3490: 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20 20 2f  _DEPRECATED).  /
34a0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
34b0: 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f  schema.]default_
34c0: 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20  cache_size.  ** 
34d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
34e0: 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73  ]default_cache_s
34f0: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
3500: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
3510: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
3520: 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20 73 65  nt persistent se
3530: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
3540: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
3550: 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  ze.  The value r
3560: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d  eturned is the m
3570: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3580: 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  .  ** pages in t
3590: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
35a0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
35b0: 73 65 74 73 20 62 6f 74 68 20 74 68 65 20 63 75  sets both the cu
35c0: 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20  rrent.  ** page 
35d0: 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
35e0: 20 61 6e 64 20 74 68 65 20 70 65 72 73 69 73 74   and the persist
35f0: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 73  ent page cache s
3600: 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73  ize value.  ** s
3610: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
3620: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
3630: 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73  .  ** Older vers
3640: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77  ions of SQLite w
3650: 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64 65 66  ould set the def
3660: 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20  ault cache size 
3670: 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69  to a.  ** negati
3680: 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64  ve number to ind
3690: 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75  icate synchronou
36a0: 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61  s=OFF.  These da
36b0: 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ys, synchronous.
36c0: 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f    ** is always o
36d0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72 65 67  n by default reg
36e0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
36f0: 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75  ign of the defau
3700: 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69  lt cache.  ** si
3710: 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75  ze.  But continu
3720: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62  e to take the ab
3730: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
3740: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68  the default cach
3750: 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68  e.  ** size of h
3760: 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74  istorical compat
3770: 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20  ibility..  */.  
3780: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 45 46  case PragTyp_DEF
3790: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a  AULT_CACHE_SIZE:
37a0: 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
37b0: 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44  nst int iLn = VD
37c0: 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f  BE_OFFSET_LINENO
37d0: 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20  (2);.    static 
37e0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
37f0: 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20   getCacheSize[] 
3800: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54  = {.      { OP_T
3810: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
3820: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20       /* 0 */.   
3850: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
3860: 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20  ie,  0, 1,      
3870: 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f    BTREE_DEFAULT_
3880: 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a  CACHE_SIZE},  /*
3890: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
38a0: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
38b0: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
38c0: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
38d0: 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20  r,     0, 2,    
38e0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
38f0: 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20  OP_Subtract,    
3900: 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c  1, 2,        1},
3910: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f  .      { OP_IfPo
3920: 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20  s,       1, 8,  
3930: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3940: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
3950: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30    0, 1,        0
3960: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20             /* 6 
3980: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f  */.      { OP_No
3990: 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  op,        0, 0,
39a0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
39b0: 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77    { OP_ResultRow
39c0: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
39d0: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
39e0: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
39f0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3a00: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
3a10: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
3a20: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
3a30: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
3a40: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
3a50: 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72  fyNoMallocRequir
3a60: 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  ed(v, ArraySize(
3a70: 67 65 74 43 61 63 68 65 53 69 7a 65 29 29 3b 0a  getCacheSize));.
3a80: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
3a90: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
3aa0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
3ab0: 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74  tCacheSize), get
3ac0: 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29 3b  CacheSize, iLn);
3ad0: 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f  .      if( ONLY_
3ae0: 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  IF_REALLOC_STRES
3af0: 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61  S(aOp==0) ) brea
3b00: 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  k;.      aOp[0].
3b10: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
3b20: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
3b30: 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31  .      aOp[6].p1
3b40: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
3b50: 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20 20  T_CACHE_SIZE;.  
3b60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
3b70: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
3b80: 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65  3AbsInt32(sqlite
3b90: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a  3Atoi(zRight));.
3ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
3bb0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
3bc0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
3bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3be0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3bf0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
3c00: 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41  BTREE_DEFAULT_CA
3c10: 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29 3b  CHE_SIZE, size);
3c20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
3c30: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3c40: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
3c50: 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ) );.      pDb->
3c60: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3c70: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
3c80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
3c90: 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e  tCacheSize(pDb->
3ca0: 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  pBt, pDb->pSchem
3cb0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  a->cache_size);.
3cc0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
3cd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
3ce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3cf0: 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21 53 51  R_PRAGMAS && !SQ
3d00: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
3d10: 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64 65  ATED */..#if !de
3d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3d30: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
3d40: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
3d50: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65  MA [schema.]page
3d60: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
3d70: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65  MA [schema.]page
3d80: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3d90: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3da0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3db0: 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72  rent setting for
3dc0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
3dd0: 73 65 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  se page size in 
3de0: 62 79 74 65 73 2e 20 20 54 68 65 20 73 65 63 6f  bytes.  The seco
3df0: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65  nd form sets the
3e00: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
3e10: 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20  age size value. 
3e20: 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e 20 6f   The value can o
3e30: 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a 20 20  nly be set if.  
3e40: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
3e50: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
3e60: 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   created..  */. 
3e70: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41   case PragTyp_PA
3e80: 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 42  GE_SIZE: {.    B
3e90: 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d  tree *pBt = pDb-
3ea0: 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
3eb0: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20  ( pBt!=0 );.    
3ec0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
3ed0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
3ee0: 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20 73 71  ALWAYS(pBt) ? sq
3ef0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
3f00: 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a  eSize(pBt) : 0;.
3f10: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
3f20: 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b 0a  leInt(v, size);.
3f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3f40: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66   /* Malloc may f
3f50: 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69 6e 67  ail when setting
3f60: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
3f70: 61 73 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  as there is an i
3f80: 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  nternal.      **
3f90: 20 62 75 66 66 65 72 20 74 68 61 74 20 74 68 65   buffer that the
3fa0: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 72 65   pager module re
3fb0: 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71 6c 69  sizes using sqli
3fc0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20  te3_realloc().. 
3fd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62       */.      db
3fe0: 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
3ff0: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
4000: 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ght);.      if( 
4010: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
4020: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
4030: 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
4040: 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30  extPagesize,-1,0
4050: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
4060: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
4070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4090: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
40a0: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72  A [schema.]secur
40b0: 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20 50  e_delete.  **  P
40c0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
40d0: 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f  ecure_delete=ON/
40e0: 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  OFF.  **.  ** Th
40f0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
4100: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
4110: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65   setting for the
4120: 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64 65 6c  .  ** secure_del
4130: 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65 20 73  ete flag.  The s
4140: 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67  econd form chang
4150: 65 73 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  es the secure_de
4160: 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67 20 73  lete.  ** flag s
4170: 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70 6f 72  etting and repor
4180: 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75 65 2e  ts thenew value.
4190: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
41a0: 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45 4c 45  gTyp_SECURE_DELE
41b0: 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  TE: {.    Btree 
41c0: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
41d0: 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d 31 3b  .    int b = -1;
41e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
41f0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  !=0 );.    if( z
4200: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 62  Right ){.      b
4210: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f   = sqlite3GetBoo
4220: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 3b  lean(zRight, 0);
4230: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
4240: 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d  Id2->n==0 && b>=
4250: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
4260: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
4270: 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  0; ii<db->nDb; i
4280: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
4290: 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
42a0: 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 69  Delete(db->aDb[i
42b0: 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20 20  i].pBt, b);.    
42c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 20    }.    }.    b 
42d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  = sqlite3BtreeSe
42e0: 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c 20  cureDelete(pBt, 
42f0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69  b);.    returnSi
4300: 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a 20  ngleInt(v, b);. 
4310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
4320: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
4330: 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61   [schema.]max_pa
4340: 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50  ge_count.  **  P
4350: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d  RAGMA [schema.]m
4360: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a  ax_page_count=N.
4370: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
4380: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
4390: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
43a0: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
43b0: 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * maximum number
43c0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
43d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
43e0: 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f 6e   The .  ** secon
43f0: 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73 20  d form attempts 
4400: 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20 73  to change this s
4410: 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20 20  etting.  Both.  
4420: 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e 20  ** forms return 
4430: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4440: 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ing..  **.  ** T
4450: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
4460: 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e 20  e of N is used. 
4470: 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d   This is undocum
4480: 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74 0a  ented and might.
4490: 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68    ** change.  Th
44a0: 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
44b0: 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  s to provide an 
44c0: 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73 74  easy way to test
44d0: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
44e0: 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e 63  3AbsInt32() func
44f0: 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
4500: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4510: 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a  ]page_count.  **
4520: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
4530: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
4540: 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   in the specifie
4550: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
4560: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4570: 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20  PAGE_COUNT: {.  
4580: 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20 20    int iReg;.    
4590: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
45a0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
45b0: 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  iDb);.    iReg =
45c0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
45d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
45e0: 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d  Tolower(zLeft[0]
45f0: 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20  )=='p' ){.      
4600: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4610: 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e  2(v, OP_Pagecoun
4620: 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a 20  t, iDb, iReg);. 
4630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4650: 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74  3(v, OP_MaxPgcnt
4660: 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20 20  , iDb, iReg, .  
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 73        sqlite3Abs
4690: 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f  Int32(sqlite3Ato
46a0: 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20 20  i(zRight)));.   
46b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
46c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
46d0: 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20  esultRow, iReg, 
46e0: 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  1);.    break;. 
46f0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4700: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c  RAGMA [schema.]l
4710: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a  ocking_mode.  **
4720: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4730: 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  .]locking_mode =
4740: 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69   (normal|exclusi
4750: 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ve).  */.  case 
4760: 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f  PragTyp_LOCKING_
4770: 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  MODE: {.    cons
4780: 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 22  t char *zRet = "
4790: 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74  normal";.    int
47a0: 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b   eMode = getLock
47b0: 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b  ingMode(zRight);
47c0: 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e  ..    if( pId2->
47d0: 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50  n==0 && eMode==P
47e0: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
47f0: 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20 20  _QUERY ){.      
4800: 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47 4d  /* Simple "PRAGM
4810: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22  A locking_mode;"
4820: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
4830: 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72 0a   is a query for.
4840: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
4850: 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f 63  rent default loc
4860: 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63 68  king mode (which
4870: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
4880: 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  t to.      ** th
4890: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f  e locking-mode o
48a0: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
48b0: 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ase)..      */. 
48c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d       eMode = db-
48d0: 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20  >dfltLockMode;. 
48e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
4900: 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e       if( pId2->n
4910: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
4920: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
4930: 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61 73   that no databas
4940: 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63 69  e name was speci
4950: 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20 20  fied as part.   
4960: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 50       ** of the P
4970: 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49  RAGMA command. I
4980: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
4990: 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73  locking-mode mus
49a0: 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
49b0: 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63  set on all attac
49c0: 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20 61  hed databases, a
49d0: 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d 61  s well as the ma
49e0: 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20 20  in db file..    
49f0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
4a00: 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69  * Also, the sqli
4a10: 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  te3.dfltLockMode
4a20: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
4a30: 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
4a40: 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75 65   ** any subseque
4a50: 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64 61  ntly attached da
4a60: 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73 65  tabases also use
4a70: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 20   the specified. 
4a80: 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e         ** lockin
4a90: 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  g mode..        
4aa0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4ab0: 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
4ac0: 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b  t(pDb==&db->aDb[
4ad0: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
4ae0: 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44  (ii=2; ii<db->nD
4af0: 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  b; ii++){.      
4b00: 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
4b10: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
4b20: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b  b->aDb[ii].pBt);
4b30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4b40: 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
4b50: 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65  de(pPager, eMode
4b60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4b70: 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63       db->dfltLoc
4b80: 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  kMode = (u8)eMod
4b90: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
4ba0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
4bb0: 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d  3BtreePager(pDb-
4bc0: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f  >pBt);.      eMo
4bd0: 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  de = sqlite3Page
4be0: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61  rLockingMode(pPa
4bf0: 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ger, eMode);.   
4c00: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
4c10: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4c20: 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
4c40: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4c50: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4c60: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f  E );.    if( eMo
4c70: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
4c80: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
4c90: 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20  ){.      zRet = 
4ca0: 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20 20  "exclusive";.   
4cb0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
4cc0: 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74 29  gleText(v, zRet)
4cd0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4ce0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
4cf0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75  GMA [schema.]jou
4d00: 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20  rnal_mode.  **  
4d10: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4d20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20  journal_mode =. 
4d30: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
4d40: 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74 65           (delete
4d50: 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72 75  |persist|off|tru
4d60: 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c  ncate|memory|wal
4d70: 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61 73  |off).  */.  cas
4d80: 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41  e PragTyp_JOURNA
4d90: 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69 6e  L_MODE: {.    in
4da0: 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  t eMode;        
4db0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41  /* One of the PA
4dc0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
4dd0: 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  XXX symbols */. 
4de0: 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
4df0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4e00: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66 28  nter */..    if(
4e10: 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   zRight==0 ){.  
4e20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4e30: 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61  is no "=MODE" pa
4e40: 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61  rt of the pragma
4e50: 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f 72  , do a query for
4e60: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 75   the.      ** cu
4e70: 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20  rrent mode */.  
4e80: 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45      eMode = PAGE
4e90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
4ea0: 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ERY;.    }else{.
4eb0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
4ec0: 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69   *zMode;.      i
4ed0: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
4ee0: 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a  rlen30(zRight);.
4ef0: 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d        for(eMode=
4f00: 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69  0; (zMode = sqli
4f10: 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61  te3JournalModena
4f20: 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65  me(eMode))!=0; e
4f30: 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Mode++){.       
4f40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
4f50: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f  ICmp(zRight, zMo
4f60: 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65 61  de, n)==0 ) brea
4f70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4f80: 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20   if( !zMode ){. 
4f90: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
4fa0: 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64 6f   "=MODE" part do
4fb0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79  es not match any
4fc0: 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d   known journal m
4fd0: 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ode,.        ** 
4fe0: 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79 20  then do a query 
4ff0: 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  */.        eMode
5000: 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
5010: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20 20  MODE_QUERY;.    
5020: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5030: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
5040: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
5050: 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29   && pId2->n==0 )
5060: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  {.      /* Conve
5070: 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  rt "PRAGMA journ
5080: 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50  al_mode" into "P
5090: 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e  RAGMA main.journ
50a0: 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20  al_mode" */.    
50b0: 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20    iDb = 0;.     
50c0: 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20   pId2->n = 1;.  
50d0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 64    }.    for(ii=d
50e0: 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b  b->nDb-1; ii>=0;
50f0: 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66   ii--){.      if
5100: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
5110: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
5120: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
5130: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5140: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
5150: 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ii);.        sql
5160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5170: 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  , OP_JournalMode
5180: 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b  , ii, 1, eMode);
5190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
51a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
51b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
51c0: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
51d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
51e0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
51f0: 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f  schema.]journal_
5200: 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20  size_limit.  ** 
5210: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
5220: 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69  ]journal_size_li
5230: 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mit=N.  **.  ** 
5240: 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 73  Get or set the s
5250: 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c  ize limit on rol
5260: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
5270: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  les..  */.  case
5280: 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c   PragTyp_JOURNAL
5290: 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20  _SIZE_LIMIT: {. 
52a0: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
52b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
52c0: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
52d0: 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d      i64 iLimit =
52e0: 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52 69   -2;.    if( zRi
52f0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
5300: 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
5310: 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69  4(zRight, &iLimi
5320: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c  t);.      if( iL
5330: 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74  imit<-1 ) iLimit
5340: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
5350: 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65   iLimit = sqlite
5360: 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
5370: 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20 69  eLimit(pPager, i
5380: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74 75  Limit);.    retu
5390: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 69  rnSingleInt(v, i
53a0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65 61  Limit);.    brea
53b0: 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f  k;.  }..#endif /
53c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  * SQLITE_OMIT_PA
53d0: 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  GER_PRAGMAS */..
53e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
53f0: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f  A [schema.]auto_
5400: 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52 41  vacuum.  **  PRA
5410: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5420: 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a  o_vacuum=N.  **.
5430: 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20    ** Get or set 
5440: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
5450: 20 64 61 74 61 62 61 73 65 20 27 61 75 74 6f 2d   database 'auto-
5460: 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74 65  vacuum' paramete
5470: 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  r..  ** The valu
5480: 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20  e is one of:  0 
5490: 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49 4e  NONE 1 FULL 2 IN
54a0: 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23  CREMENTAL.  */.#
54b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
54c0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
54d0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 55 54  case PragTyp_AUT
54e0: 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20  O_VACUUM: {.    
54f0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62  Btree *pBt = pDb
5500: 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
5510: 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20  t( pBt!=0 );.   
5520: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
5530: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
5540: 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
5550: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
5560: 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 65  um(pBt));.    }e
5570: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  lse{.      int e
5580: 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56 61  Auto = getAutoVa
5590: 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20  cuum(zRight);.  
55a0: 20 20 20 20 61 73 73 65 72 74 28 20 65 41 75 74      assert( eAut
55b0: 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d 32  o>=0 && eAuto<=2
55c0: 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65   );.      db->ne
55d0: 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38 29  xtAutovac = (u8)
55e0: 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20  eAuto;.      /* 
55f0: 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63 75  Call SetAutoVacu
5600: 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69 74  um() to set init
5610: 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65 72  ialize the inter
5620: 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20 20  nal auto and.   
5630: 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75     ** incr-vacuu
5640: 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69 73  m flags. This is
5650: 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73   required in cas
5660: 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
5670: 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74  n.      ** creat
5680: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
5690: 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70 6f  file. It is impo
56a0: 72 74 61 6e 74 20 74 68 61 74 20 69 74 20 69 73  rtant that it is
56b0: 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a   created.      *
56c0: 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  * as an auto-vac
56d0: 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e 0a  uum capable db..
56e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
56f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5700: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42  SetAutoVacuum(pB
5710: 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20 20  t, eAuto);.     
5720: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5730: 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31 20  OK && (eAuto==1 
5740: 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a  || eAuto==2) ){.
5750: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
5760: 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74 6f  setting the auto
5770: 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20  _vacuum mode to 
5780: 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f 72  either "full" or
5790: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69 6e   .        ** "in
57a0: 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74  cremental", writ
57b0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  e the value of m
57c0: 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64 61  eta[6] in the da
57d0: 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
57e0: 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 77  * file. Before w
57f0: 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36  riting to meta[6
5800: 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d 65  ], check that me
5810: 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73 0a  ta[3] indicates.
5820: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
5830: 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61  this really is a
5840: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  n auto-vacuum ca
5850: 70 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e 0a  pable database..
5860: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5870: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5880: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
5890: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
58a0: 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20  .        static 
58b0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
58c0: 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a   setMeta6[] = {.
58d0: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54            { OP_T
58e0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30  ransaction,    0
58f0: 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20  ,         1,    
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c               0},
5910: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
5920: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
5930: 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20 20  ookie,     0,   
5940: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
5950: 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52   BTREE_LARGEST_R
5960: 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20  OOT_PAGE},.     
5970: 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20       { OP_If,   
5980: 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20            1,    
5990: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
59a0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
59b0: 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  * 2 */.         
59c0: 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20   { OP_Halt,     
59d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c        SQLITE_OK,
59e0: 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20 20   OE_Abort,      
59f0: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20      0},    /* 3 
5a00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f  */.          { O
5a10: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20  P_SetCookie,    
5a20: 20 20 30 2c 20 20 20 20 20 20 20 20 20 42 54 52    0,         BTR
5a30: 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c 20  EE_INCR_VACUUM, 
5a40: 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20  0},    /* 4 */. 
5a50: 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
5a60: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
5a70: 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
5a80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
5a90: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
5aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ab0: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
5ac0: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
5ad0: 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29 3b  Size(setMeta6));
5ae0: 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20 73  .        aOp = s
5af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
5b00: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
5b10: 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74 4d  (setMeta6), setM
5b20: 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20 20  eta6, iLn);.    
5b30: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
5b40: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
5b50: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
5b60: 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70          aOp[0].p
5b70: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20  1 = iDb;.       
5b80: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
5b90: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d  ;.        aOp[2]
5ba0: 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a 20  .p2 = iAddr+4;. 
5bb0: 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70 31         aOp[4].p1
5bc0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20   = iDb;.        
5bd0: 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75 74  aOp[4].p3 = eAut
5be0: 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  o - 1;.        s
5bf0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
5c00: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
5c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
5c20: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
5c30: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5c40: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e 63  GMA [schema.]inc
5c50: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28  remental_vacuum(
5c60: 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20  N).  **.  ** Do 
5c70: 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72 65  N steps of incre
5c80: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e 67  mental vacuuming
5c90: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e 0a   on a database..
5ca0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5cb0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5cc0: 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67 54  UUM.  case PragT
5cd0: 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56  yp_INCREMENTAL_V
5ce0: 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e 74  ACUUM: {.    int
5cf0: 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a 20   iLimit, addr;. 
5d00: 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30     if( zRight==0
5d10: 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74 49   || !sqlite3GetI
5d20: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69 4c  nt32(zRight, &iL
5d30: 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74 3c  imit) || iLimit<
5d40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  =0 ){.      iLim
5d50: 69 74 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  it = 0x7fffffff;
5d60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5d70: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
5d80: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
5d90: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
5da0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5db0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69 6d  OP_Integer, iLim
5dc0: 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  it, 1);.    addr
5dd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5de0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72 56  dOp1(v, OP_IncrV
5df0: 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64 62  acuum, iDb); Vdb
5e00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5e10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e20: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op1(v, OP_Result
5e30: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Row, 1);.    sql
5e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5e50: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
5e60: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
5e70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5e80: 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72 29  _IfPos, 1, addr)
5e90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5ea0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5eb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5ec0: 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  dr);.    break;.
5ed0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
5ee0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5ef0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20  PAGER_PRAGMAS.  
5f00: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
5f10: 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73  [schema.]cache_s
5f20: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
5f30: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
5f40: 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  size=N.  **.  **
5f50: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
5f60: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
5f70: 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  ent local settin
5f80: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
5f90: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
5fa0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
5fb0: 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20  sets the local. 
5fc0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
5fd0: 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20 4e  ize value.  If N
5fe0: 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65   is positive the
5ff0: 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  n that is the.  
6000: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6010: 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
6020: 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69    If N is negati
6030: 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ve, then the.  *
6040: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
6050: 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f  s is adjusted so
6060: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
6070: 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65  uses -N kibibyte
6080: 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  s.  ** of memory
6090: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
60a0: 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a 45  agTyp_CACHE_SIZE
60b0: 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  : {.    assert( 
60c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
60d0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
60e0: 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  0) );.    if( !z
60f0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
6100: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6110: 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  , pDb->pSchema->
6120: 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20  cache_size);.   
6130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
6140: 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  t size = sqlite3
6150: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
6160: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
6170: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73  ->cache_size = s
6180: 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
6190: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
61a0: 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44  ize(pDb->pBt, pD
61b0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
61c0: 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  e_size);.    }. 
61d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
61e0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
61f0: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6200: 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41 47  spill.  **  PRAG
6210: 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42  MA cache_spill=B
6220: 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52 41  OOLEAN.  **  PRA
6230: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63  GMA [schema.]cac
6240: 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a  he_spill=N.  **.
6250: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
6260: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
6270: 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65  current local se
6280: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
6290: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 70  ** page cache sp
62a0: 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73 65  ill size. The se
62b0: 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73 20  cond form turns 
62c0: 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a 20  cache spill on. 
62d0: 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68 65   ** or off.  Whe
62e0: 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68 65  n turnning cache
62f0: 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20 73   spill on, the s
6300: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6310: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 63  e.  ** current c
6320: 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65 20  ache_size.  The 
6330: 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73 20  third form sets 
6340: 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68 61  a spill size tha
6350: 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64 69  t.  ** may be di
6360: 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68 65  fferent form the
6370: 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 2a   cache size..  *
6380: 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74 69  * If N is positi
6390: 76 65 20 74 68 65 6e 20 74 68 61 74 20 69 73 20  ve then that is 
63a0: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
63b0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
63c0: 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73 20  cache.  If N is 
63d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
63e0: 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  he.  ** number o
63f0: 66 20 70 61 67 65 73 20 69 73 20 61 64 6a 75 73  f pages is adjus
6400: 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ted so that the 
6410: 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b 69  cache uses -N ki
6420: 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20  bibytes.  ** of 
6430: 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  memory..  **.  *
6440: 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
6450: 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20 70  of cache_spill p
6460: 61 67 65 73 20 69 73 20 6c 65 73 73 20 74 68 65  ages is less the
6470: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
6480: 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65 20    ** cache_size 
6490: 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c 69  pages, no spilli
64a0: 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c 20  ng occurs until 
64b0: 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20 65  the page count e
64c0: 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65 20  xceeds.  ** the 
64d0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 5f  number of cache_
64e0: 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a 2a  size pages..  **
64f0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65 5f  .  ** The cache_
6500: 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65  spill=BOOLEAN se
6510: 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74 6f  tting applies to
6520: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73 63   all attached sc
6530: 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  hemas,.  ** not 
6540: 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d 61 20  just the schema 
6550: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a  specified..  */.
6560: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
6570: 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20  ACHE_SPILL: {.  
6580: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6590: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
65a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
65b0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
65c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
65d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20 20  ingleInt(v,.    
65e0: 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 20       (db->flags 
65f0: 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70  & SQLITE_CacheSp
6600: 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a 20  ill)==0 ? 0 : . 
6610: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6620: 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
6630: 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29 29  ize(pDb->pBt,0))
6640: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6650: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31 3b     int size = 1;
6660: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6670: 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68  e3GetInt32(zRigh
6680: 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20 20  t, &size) ){.   
6690: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
66a0: 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44  eSetSpillSize(pD
66b0: 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20  b->pBt, size);. 
66c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
66d0: 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
66e0: 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65 21  an(zRight, size!
66f0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64  =0) ){.        d
6700: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
6710: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20  TE_CacheSpill;. 
6720: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6730: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
6740: 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70   ~SQLITE_CacheSp
6750: 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ill;.      }.   
6760: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
6770: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  ags(db);.    }. 
6780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6790: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
67a0: 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73   [schema.]mmap_s
67b0: 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  ize(N).  **.  **
67c0: 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70   Used to set map
67d0: 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e  ping size limit.
67e0: 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a   The mapping siz
67f0: 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20  e limit is.  ** 
6800: 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68  used to limit th
6810: 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65  e aggregate size
6820: 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d   of all memory m
6830: 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66  apped regions of
6840: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
6850: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73  se file. If this
6860: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
6870: 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t to zero, then 
6880: 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20  memory mapping. 
6890: 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20   ** is not used 
68a0: 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73  at all.  If N is
68b0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
68c0: 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  the default memo
68d0: 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69  ry map.  ** limi
68e0: 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  t determined by 
68f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
6900: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
6910: 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a  P_SIZE) is set..
6920: 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74    ** The paramet
6930: 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64  er N is measured
6940: 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a   in bytes..  **.
6950: 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20    ** This value 
6960: 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68  is advisory.  Th
6970: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53  e underlying VFS
6980: 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f   is free to memo
6990: 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c  ry map.  ** as l
69a0: 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68  ittle or as much
69b0: 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45   as it wants.  E
69c0: 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73  xcept, if N is s
69d0: 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65  et to 0 then the
69e0: 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65  .  ** upper laye
69f0: 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e  rs will never in
6a00: 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68 20  voke the xFetch 
6a10: 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74 68  interfaces to th
6a20: 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61  e VFS..  */.  ca
6a30: 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f  se PragTyp_MMAP_
6a40: 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69  SIZE: {.    sqli
6a50: 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69  te3_int64 sz;.#i
6a60: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
6a70: 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73  P_SIZE>0.    ass
6a80: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
6a90: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
6aa0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69  iDb, 0) );.    i
6ab0: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
6ac0: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
6ad0: 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
6ae0: 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73  ToI64(zRight, &s
6af0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  z);.      if( sz
6b00: 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65  <0 ) sz = sqlite
6b10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
6b20: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20  Mmap;.      if( 
6b30: 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d  pId2->n==0 ) db-
6b40: 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20  >szMmap = sz;.  
6b50: 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e      for(ii=db->n
6b60: 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d  Db-1; ii>=0; ii-
6b70: 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
6b80: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20  db->aDb[ii].pBt 
6b90: 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70  && (ii==iDb || p
6ba0: 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20  Id2->n==0) ){.  
6bb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
6bc0: 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
6bd0: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
6be0: 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  , sz);.        }
6bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6c00: 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20     sz = -1;.    
6c10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
6c20: 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
6c30: 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
6c40: 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
6c50: 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20  .#else.    sz = 
6c60: 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  0;.    rc = SQLI
6c70: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
6c80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6c90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
6ca0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
6cb0: 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  sz);.    }else i
6cc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc!=SQLITE_NO
6cd0: 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  TFOUND ){.      
6ce0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
6cf0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
6d00: 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   = rc;.    }.   
6d10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6d20: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
6d30: 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20  temp_store.  ** 
6d40: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
6d50: 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c  ore = "default"|
6d60: 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a  "memory"|"file".
6d70: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
6d80: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
6d90: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  l value of the t
6da0: 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20  emp_store flag. 
6db0: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
6dc0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
6dd0: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
6de0: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
6df0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65   file and the de
6e00: 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65  fault.  ** value
6e10: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
6e20: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
6e30: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
6e40: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  opened..  **.  *
6e50: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  * Note that it i
6e60: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
6e70: 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69  he library compi
6e80: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
6e90: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65  to.  ** override
6ea0: 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20   this setting.  
6eb0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
6ec0: 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a  p_TEMP_STORE: {.
6ed0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
6ee0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
6ef0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e  ingleInt(v, db->
6f00: 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20  temp_store);.   
6f10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
6f20: 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28  angeTempStorage(
6f30: 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b  pParse, zRight);
6f40: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6f50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6f60: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6f70: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20  tore_directory. 
6f80: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d   **   PRAGMA tem
6f90: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
6fa0: 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72  y = ""|"director
6fb0: 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a  y_name".  **.  *
6fc0: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
6fd0: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
6fe0: 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72  of the temp_stor
6ff0: 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67  e_directory flag
7000: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
7010: 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20   the value sets 
7020: 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63  a specific direc
7030: 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20  tory to be used 
7040: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
7050: 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e  les..  ** Settin
7060: 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69  g to a null stri
7070: 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68  ng reverts to th
7080: 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72  e default tempor
7090: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65  ary directory se
70a0: 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65  arch..  ** If te
70b0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
70c0: 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  y is changed, th
70d0: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d  en invalidateTem
70e0: 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20  pStorage..  **. 
70f0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7100: 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49  yp_TEMP_STORE_DI
7110: 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69  RECTORY: {.    i
7120: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
7130: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
7140: 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  Text(v, sqlite3_
7150: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
7160: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  .    }else{.#ifn
7170: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7180: 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52  WSD.      if( zR
7190: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
71a0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
71b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
71c0: 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66  OsAccess(db->pVf
71d0: 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54  s, zRight, SQLIT
71e0: 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
71f0: 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  TE, &res);.     
7200: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7210: 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29  E_OK || res==0 )
7220: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7230: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7240: 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61  se, "not a writa
7250: 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b  ble directory");
7260: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
7270: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20  pragma_out;.    
7280: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7290: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
72a0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20  EMP_STORE==0.   
72b0: 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54      || (SQLITE_T
72c0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20  EMP_STORE==1 && 
72d0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d  db->temp_store<=
72e0: 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51  1).       || (SQ
72f0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
7300: 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73  =2 && db->temp_s
7310: 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29  tore==1).      )
7320: 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
7330: 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28  dateTempStorage(
7340: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
7350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7360: 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  ree(sqlite3_temp
7370: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
7380: 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d     if( zRight[0]
7390: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
73a0: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
73b0: 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
73c0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68  intf("%s", zRigh
73d0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
73e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
73f0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
7400: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
7410: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7420: 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a  IT_WSD */.    }.
7430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
7440: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7450: 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  N.  /*.  **   PR
7460: 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f  AGMA data_store_
7470: 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20  directory.  **  
7480: 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f   PRAGMA data_sto
7490: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22  re_directory = "
74a0: 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d  "|"directory_nam
74b0: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  e".  **.  ** Ret
74c0: 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c  urn or set the l
74d0: 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  ocal value of th
74e0: 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  e data_store_dir
74f0: 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68  ectory flag.  Ch
7500: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
7510: 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65  value sets a spe
7520: 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20  cific directory 
7530: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64  to be used for d
7540: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68  atabase files th
7550: 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65  at.  ** were spe
7560: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
7570: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
7580: 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e    Setting to a n
7590: 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72  ull string rever
75a0: 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  ts.  ** to the d
75b0: 65 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20  efault database 
75c0: 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68  directory, which
75d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
75e0: 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69  les specified wi
75f0: 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69  th.  ** a relati
7600: 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f  ve path will pro
7610: 62 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f  bably be based o
7620: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69  n the current di
7630: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a  rectory for the.
7640: 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44    ** process.  D
7650: 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65  atabase file spe
7660: 63 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61  cified with an a
7670: 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65  bsolute path are
7680: 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20   not impacted.  
7690: 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69  ** by this setti
76a0: 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ng, regardless o
76b0: 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a  f its value..  *
76c0: 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  *.  */.  case Pr
76d0: 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45  agTyp_DATA_STORE
76e0: 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20  _DIRECTORY: {.  
76f0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7700: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7710: 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74  gleText(v, sqlit
7720: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7730: 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  y);.    }else{.#
7740: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7750: 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28  IT_WSD.      if(
7760: 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20   zRight[0] ){.  
7770: 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
7780: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7790: 74 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e  te3OsAccess(db->
77a0: 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51  pVfs, zRight, SQ
77b0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
77c0: 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20  WRITE, &res);.  
77d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
77e0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d  LITE_OK || res==
77f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
7800: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7810: 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72  Parse, "not a wr
7820: 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79  itable directory
7830: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ");.          go
7840: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
7850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7870: 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61  ree(sqlite3_data
7880: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
7890: 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d     if( zRight[0]
78a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
78b0: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
78c0: 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
78d0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68  intf("%s", zRigh
78e0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
78f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7900: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
7910: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
7920: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7930: 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a  IT_WSD */.    }.
7940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
7950: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
7960: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
7970: 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _STYLE.  /*.  **
7980: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
7990: 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  a.]lock_proxy_fi
79a0: 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  le.  **   PRAGMA
79b0: 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70   [schema.]lock_p
79c0: 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75  roxy_file = ":au
79d0: 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f  to:"|"lock_file_
79e0: 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  path".  **.  ** 
79f0: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
7a00: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  e value of the l
7a10: 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66  ock_proxy_file f
7a20: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
7a30: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65   ** the value se
7a40: 74 73 20 61 20 73 70 65 63 69 66 69 63 20 66 69  ts a specific fi
7a50: 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  le to be used fo
7a60: 72 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  r database acces
7a70: 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20  s locks..  **.  
7a80: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
7a90: 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c  p_LOCK_PROXY_FIL
7aa0: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  E: {.    if( !zR
7ab0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61  ight ){.      Pa
7ac0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71  ger *pPager = sq
7ad0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
7ae0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
7af0: 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c   char *proxy_fil
7b00: 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  e_path = NULL;. 
7b10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
7b20: 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
7b30: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
7b40: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
7b50: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
7b60: 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
7b70: 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
7b80: 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ILE, .          
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74   &proxy_file_pat
7bb0: 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  h);.      return
7bc0: 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72  SingleText(v, pr
7bd0: 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a  oxy_file_path);.
7be0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7bf0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
7c00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
7c10: 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  er(pDb->pBt);.  
7c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7c30: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7c40: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7c50: 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  r);.      int re
7c60: 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  s;.      if( zRi
7c70: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7c80: 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46    res=sqlite3OsF
7c90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65  ileControl(pFile
7ca0: 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
7cb0: 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20  KPROXYFILE, .   
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20    zRight);.     
7cf0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
7d00: 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46    res=sqlite3OsF
7d10: 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65  ileControl(pFile
7d20: 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  , SQLITE_SET_LOC
7d30: 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20  KPROXYFILE, .   
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d    NULL);.      }
7d70: 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d  .      if( res!=
7d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7d90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7da0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 61  rMsg(pParse, "fa
7db0: 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b  iled to set lock
7dc0: 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20   proxy file");. 
7dd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67         goto prag
7de0: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ma_out;.      }.
7df0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7e00: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
7e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
7e20: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20  KING_STYLE */   
7e30: 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20     .    .  /*.  
7e40: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7e50: 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73  ema.]synchronous
7e60: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
7e70: 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e  schema.]synchron
7e80: 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41  ous=OFF|ON|NORMA
7e90: 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a  L|FULL|EXTRA.  *
7ea0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
7eb0: 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76   set the local v
7ec0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63  alue of the sync
7ed0: 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43  hronous flag.  C
7ee0: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7ef0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
7f00: 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
7f10: 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
7f20: 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a  ile and the.  **
7f30: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
7f40: 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
7f50: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
7f60: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20  e database is.  
7f70: 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  ** opened..  */.
7f80: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
7f90: 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20  YNCHRONOUS: {.  
7fa0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
7fb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
7fc0: 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73  gleInt(v, pDb->s
7fd0: 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a  afety_level-1);.
7fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7ff0: 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f   if( !db->autoCo
8000: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
8010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8020: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
8030: 20 20 20 20 20 22 53 61 66 65 74 79 20 6c 65 76       "Safety lev
8040: 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68  el may not be ch
8050: 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20 74  anged inside a t
8060: 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20  ransaction");.  
8070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8080: 20 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20     int iLevel = 
8090: 28 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  (getSafetyLevel(
80a0: 7a 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26  zRight,0,1)+1) &
80b0: 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
80c0: 55 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20  US_MASK;.       
80d0: 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29   if( iLevel==0 )
80e0: 20 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20   iLevel = 1;.   
80f0: 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
8100: 5f 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b  _level = iLevel;
8110: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53  .        pDb->bS
8120: 79 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  yncSet = 1;.    
8130: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
8140: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20  lags(db);.      
8150: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8160: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8170: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
8180: 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ER_PRAGMAS */..#
8190: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81a0: 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a  IT_FLAG_PRAGMAS.
81b0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
81c0: 4c 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  LAG: {.    if( z
81d0: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
81e0: 20 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c    setPragmaResul
81f0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20  tColumnNames(v, 
8200: 70 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20  pPragma);.      
8210: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
8220: 76 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  v, (db->flags & 
8230: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d  pPragma->iArg)!=
8240: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
8250: 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d        int mask =
8260: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20   pPragma->iArg; 
8270: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69     /* Mask of bi
8280: 74 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65  ts to set or cle
8290: 61 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ar. */.      if(
82a0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
82b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
82c0: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70   Foreign key sup
82d0: 70 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  port may not be 
82e0: 65 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62  enabled or disab
82f0: 6c 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20  led while not.  
8300: 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f        ** in auto
8310: 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a  -commit mode.  *
8320: 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26  /.        mask &
8330: 3d 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69  = ~(SQLITE_Forei
8340: 67 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d  gnKeys);.      }
8350: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
8360: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
8370: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75        if( db->au
8380: 74 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41  th.authLevel==UA
8390: 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20  UTH_User ){.    
83a0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
83b0: 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73  low non-admin us
83c0: 65 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ers to modify th
83d0: 65 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61  e schema arbitra
83e0: 72 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  rily */.        
83f0: 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45  mask &= ~(SQLITE
8400: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20  _WriteSchema);. 
8410: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
8420: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8430: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
8440: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t, 0) ){.       
8450: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61   db->flags |= ma
8460: 73 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  sk;.      }else{
8470: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
8480: 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  gs &= ~mask;.   
8490: 20 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53       if( mask==S
84a0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29  QLITE_DeferFKs )
84b0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
84c0: 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
84d0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e   }..      /* Man
84e0: 79 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72  y of the flag-pr
84f0: 61 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65  agmas modify the
8500: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
8510: 62 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20  by the SQL .    
8520: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65    ** compiler (e
8530: 67 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  g. count_changes
8540: 29 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63  ). So add an opc
8550: 6f 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c  ode to expire al
8560: 6c 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69  l.      ** compi
8570: 6c 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  led SQL statemen
8580: 74 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69  ts after modifyi
8590: 6e 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75  ng a pragma valu
85a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
85b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
85c0: 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op0(v, OP_Expire
85d0: 29 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50  );.      setAllP
85e0: 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20  agerFlags(db);. 
85f0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8600: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8610: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50  LITE_OMIT_FLAG_P
8620: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
8630: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8640: 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20  CHEMA_PRAGMAS.  
8650: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
8660: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62   table_info(<tab
8670: 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  le>).  **.  ** R
8680: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
8690: 6f 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ow for each colu
86a0: 6d 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  mn of the named 
86b0: 74 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d  table. The colum
86c0: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72  ns of.  ** the r
86d0: 65 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74  eturned data set
86e0: 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
86f0: 63 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75  cid:        Colu
8700: 6d 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20  mn id (numbered 
8710: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
8720: 68 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20  ht, starting at 
8730: 30 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20  0).  ** name:   
8740: 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a      Column name.
8750: 20 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20    ** type:      
8760: 20 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   Column declarat
8770: 69 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e  ion type..  ** n
8780: 6f 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20  otnull:    True 
8790: 69 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73  if 'NOT NULL' is
87a0: 20 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   part of column 
87b0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a  declaration.  **
87c0: 20 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65   dflt_value: The
87d0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
87e0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69  or the column, i
87f0: 66 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  f any..  */.  ca
8800: 73 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45  se PragTyp_TABLE
8810: 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68  _INFO: if( zRigh
8820: 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  t ){.    Table *
8830: 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d  pTab;.    pTab =
8840: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
8850: 62 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41  ble(pParse, LOCA
8860: 54 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74  TE_NOERR, zRight
8870: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
8880: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e  pTab ){.      in
8890: 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e  t i, k;.      in
88a0: 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20  t nHidden = 0;. 
88b0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f       Column *pCo
88c0: 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  l;.      Index *
88d0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
88e0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
88f0: 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  b);.      pParse
8900: 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20  ->nMem = 6;.    
8910: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
8920: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
8930: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
8940: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
8950: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
8960: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  pTab);.      for
8970: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
8980: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
8990: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
89a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ){.        if( I
89b0: 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43  sHiddenColumn(pC
89c0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ol) ){.         
89d0: 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20   nHidden++;.    
89e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
89f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a00: 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c    if( (pCol->col
8a10: 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
8a20: 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20  PRIMKEY)==0 ){. 
8a30: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a           k = 0;.
8a40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8a50: 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPk==0 ){.    
8a60: 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20        k = 1;.   
8a70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a80: 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
8a90: 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20  <=pTab->nCol && 
8aa0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d  pPk->aiColumn[k-
8ab0: 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20  1]!=i; k++){}.  
8ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ad0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44  assert( pCol->pD
8ae0: 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e  flt==0 || pCol->
8af0: 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50  pDflt->op==TK_SP
8b00: 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  AN );.        sq
8b10: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
8b20: 61 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69  ad(v, 1, "issisi
8b30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8b40: 20 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20    i-nHidden,.   
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
8b60: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
8b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
8b80: 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22  olumnType(pCol,"
8b90: 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
8ba0: 20 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c     pCol->notNull
8bb0: 20 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20   ? 1 : 0,.      
8bc0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
8bd0: 44 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66  Dflt ? pCol->pDf
8be0: 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30  lt->u.zToken : 0
8bf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8c00: 20 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   k);.        sql
8c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8c20: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8c30: 31 2c 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 6);.      }. 
8c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
8c50: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
8c60: 5f 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72  _DEBUG.  case Pr
8c70: 61 67 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20  agTyp_STATS: {. 
8c80: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
8c90: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b      HashElem *i;
8ca0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
8cb0: 6d 20 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74  m = 5;.    sqlit
8cc0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
8cd0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
8ce0: 0a 20 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  .    for(i=sqlit
8cf0: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
8d00: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
8d10: 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  h); i; i=sqliteH
8d20: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
8d30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
8d40: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
8d50: 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
8d60: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
8d70: 2c 20 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20  , 1, "ssiii",.  
8d80: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
8d90: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
8da0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   0,.           p
8db0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20  Tab->szTabRow,. 
8dc0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
8dd0: 6e 52 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20  nRowLogEst,.    
8de0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62         pTab->tab
8df0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71  Flags);.      sq
8e00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8e10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8e20: 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 66 6f   1, 5);.      fo
8e30: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
8e40: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
8e50: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
8e60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e70: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c  eMultiLoad(v, 2,
8e80: 20 22 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20   "siii",.       
8e90: 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c      pIdx->zName,
8ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
8eb0: 2d 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20  ->szIdxRow,.    
8ec0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52         pIdx->aiR
8ed0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20  owLogEst[0],.   
8ee0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61          pIdx->ha
8ef0: 73 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20  sStat1);.       
8f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8f10: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
8f20: 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20  ow, 1, 5);.     
8f30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
8f40: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
8f50: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44  case PragTyp_IND
8f60: 45 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69  EX_INFO: if( zRi
8f70: 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ght ){.    Index
8f80: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
8f90: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64  e *pTab;.    pId
8fa0: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
8fb0: 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c  ndex(db, zRight,
8fc0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8fd0: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Idx ){.      int
8fe0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   i;.      int mx
8ff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61  ;.      if( pPra
9000: 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20  gma->iArg ){.   
9010: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
9020: 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65  ndex_xinfo (newe
9030: 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d  r version with m
9040: 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c  ore rows and col
9050: 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20  umns) */.       
9060: 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c   mx = pIdx->nCol
9070: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61  umn;.        pPa
9080: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20  rse->nMem = 6;. 
9090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
90a0: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
90b0: 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79  dex_info (legacy
90c0: 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20   version) */.   
90d0: 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e       mx = pIdx->
90e0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
90f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9100: 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  3;.      }.     
9110: 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54   pTab = pIdx->pT
9120: 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  able;.      sqli
9130: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
9140: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
9150: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9160: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50  pParse->nMem<=pP
9170: 72 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d  ragma->nPragCNam
9180: 65 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  e );.      for(i
9190: 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a  =0; i<mx; i++){.
91a0: 20 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d          i16 cnum
91b0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
91c0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  n[i];.        sq
91d0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
91e0: 61 64 28 76 2c 20 31 2c 20 22 69 69 73 22 2c 20  ad(v, 1, "iis", 
91f0: 69 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20  i, cnum,.       
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30        cnum<0 ? 0
9220: 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e   : pTab->aCol[cn
9230: 75 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  um].zName);.    
9240: 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d      if( pPragma-
9250: 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >iArg ){.       
9260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9270: 6c 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69  ltiLoad(v, 4, "i
9280: 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  si",.           
9290: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
92a0: 72 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  r[i],.          
92b0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69    pIdx->azColl[i
92c0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ],.            i
92d0: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  <pIdx->nKeyCol);
92e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
92f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9300: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9310: 74 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d  tRow, 1, pParse-
9320: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  >nMem);.      }.
9330: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9340: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9350: 79 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69  yp_INDEX_LIST: i
9360: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9370: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9380: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9390: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54     int i;.    pT
93a0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
93b0: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
93c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
93d0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50  pTab ){.      pP
93e0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a  arse->nMem = 5;.
93f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
9400: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
9410: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
9420: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
9430: 3e 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49  >pIndex, i=0; pI
9440: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9450: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
9460: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9470: 61 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22  azOrigin[] = { "
9480: 63 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b  c", "u", "pk" };
9490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
94a0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
94b0: 20 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20   1, "isisi",.   
94c0: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
94d0: 20 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d        pIdx->zNam
94e0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73  e,.           Is
94f0: 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
9500: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
9510: 4f 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78  Origin[pIdx->idx
9520: 54 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Type],.         
9530: 20 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78    pIdx->pPartIdx
9540: 57 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20  Where!=0);.     
9550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9560: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9570: 74 52 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20  tRow, 1, 5);.   
9580: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9590: 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20   break;..  case 
95a0: 50 72 61 67 54 79 70 5f 44 41 54 41 42 41 53 45  PragTyp_DATABASE
95b0: 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74  _LIST: {.    int
95c0: 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
95d0: 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f  nMem = 3;.    fo
95e0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
95f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9600: 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
9610: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
9620: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
9630: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
9640: 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e!=0 );.      sq
9650: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9660: 61 64 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a  ad(v, 1, "iss",.
9670: 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20           i,.    
9680: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e       db->aDb[i].
9690: 7a 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20  zDbSName,.      
96a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47     sqlite3BtreeG
96b0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
96c0: 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20  Db[i].pBt));.   
96d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
96e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
96f0: 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20  tRow, 1, 3);.   
9700: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9710: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9720: 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20  COLLATION_LIST: 
9730: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
9740: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
9750: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9760: 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
9770: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
9780: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
9790: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
97a0: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20  hNext(p)){.     
97b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
97c0: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
97d0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
97e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
97f0: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9800: 20 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c   "is", i++, pCol
9810: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
9820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9830: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9840: 6f 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d  ow, 1, 2);.    }
9850: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
9860: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9870: 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d  MIT_SCHEMA_PRAGM
9880: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
9890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
98a0: 47 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20 50 72  GN_KEY.  case Pr
98b0: 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45  agTyp_FOREIGN_KE
98c0: 59 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67  Y_LIST: if( zRig
98d0: 68 74 20 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a  ht ){.    FKey *
98e0: 70 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  pFK;.    Table *
98f0: 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d  pTab;.    pTab =
9900: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
9910: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
9920: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
9930: 20 29 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20   ){.      pFK = 
9940: 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20  pTab->pFKey;.   
9950: 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20 20     if( pFK ){.  
9960: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b        int i = 0;
9970: 20 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65   .        pParse
9980: 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20  ->nMem = 8;.    
9990: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
99a0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
99b0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
99c0: 20 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20    while(pFK){.  
99d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
99e0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
99f0: 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a  ; j<pFK->nCol; j
9a00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
9a10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9a20: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73  iLoad(v, 1, "iis
9a30: 73 73 73 73 73 22 2c 0a 20 20 20 20 20 20 20 20  sssss",.        
9a40: 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20             i,.  
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   j,.            
9a70: 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c         pFK->zTo,
9a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a90: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
9aa0: 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f  FK->aCol[j].iFro
9ab0: 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  m].zName,.      
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
9ad0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a  ->aCol[j].zCol,.
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46     actionName(pF
9b00: 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20  K->aAction[1]), 
9b10: 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f   /* ON UPDATE */
9b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9b30: 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70      actionName(p
9b40: 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c  FK->aAction[0]),
9b50: 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a    /* ON DELETE *
9b60: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
9b70: 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20       "NONE");.  
9b80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9b90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9ba0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
9bb0: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  8);.          }.
9bc0: 20 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20            ++i;. 
9bd0: 20 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70           pFK = p
9be0: 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  FK->pNextFrom;. 
9bf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9c00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9c10: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ak;.#endif /* !d
9c20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9c30: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
9c40: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
9c50: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
9c60: 4b 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  KEY.#ifndef SQLI
9c70: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
9c80: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
9c90: 4f 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b  OREIGN_KEY_CHECK
9ca0: 3a 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  : {.    FKey *pF
9cb0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
9cc0: 2a 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  * A foreign key 
9cd0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
9ce0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
9cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c           /* Chil
9d00: 64 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20  d table contain 
9d10: 22 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79  "REFERENCES" key
9d20: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c  word */.    Tabl
9d30: 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
9d40: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62     /* Parent tab
9d50: 6c 65 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f  le that child po
9d60: 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49  ints to */.    I
9d70: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
9d80: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
9d90: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
9da0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  le */.    int i;
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
9dd0: 3a 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e  :  Foreign key n
9de0: 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a  umber for pTab *
9df0: 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e10: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46  Loop counter:  F
9e20: 69 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65  ield of the fore
9e30: 69 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48  ign key */.    H
9e40: 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
9e50: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9e60: 75 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62  unter:  Next tab
9e70: 6c 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a  le in schema */.
9e80: 20 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20      int x;      
9e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65             /* re
9ea0: 73 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f  sult variable */
9eb0: 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 75  .    int regResu
9ec0: 6c 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33  lt;         /* 3
9ed0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
9ee0: 6c 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ld a result row 
9ef0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65  */.    int regKe
9f00: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
9f10: 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c   Register to hol
9f20: 64 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69  d key for checki
9f30: 6e 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20  ng the FK */.   
9f40: 20 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20   int regRow;    
9f50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
9f60: 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72  ters to hold a r
9f70: 6f 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a  ow from pTab */.
9f80: 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
9f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
9fa0: 70 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63  p of a loop chec
9fb0: 6b 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79  king foreign key
9fc0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
9fd0: 72 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  rOk;            
9fe0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
9ff0: 74 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f  the key is OK */
a000: 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73  .    int *aiCols
a010: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  ;           /* c
a020: 68 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63  hild to parent c
a030: 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f  olumn mapping */
a040: 0a 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20  ..    regResult 
a050: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
a060: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
a070: 65 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67  em += 4;.    reg
a080: 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Key = ++pParse->
a090: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77  nMem;.    regRow
a0a0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a0b0: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  m;.    sqlite3Co
a0c0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
a0d0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
a0e0: 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46   k = sqliteHashF
a0f0: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44  irst(&db->aDb[iD
a100: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b].pSchema->tblH
a110: 61 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ash);.    while(
a120: 20 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   k ){.      if( 
a130: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
a140: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
a150: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
a160: 73 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a  se, 0, zRight, z
a170: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d  Db);.        k =
a180: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
a190: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
a1a0: 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
a1b0: 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
a1c0: 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73     k = sqliteHas
a1d0: 68 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20  hNext(k);.      
a1e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  }.      if( pTab
a1f0: 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b  ==0 || pTab->pFK
a200: 65 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ey==0 ) continue
a210: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
a220: 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
a230: 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
a240: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
a250: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
a260: 62 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70  b->nCol+regRow>p
a270: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50  Parse->nMem ) pP
a280: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61  arse->nMem = pTa
a290: 62 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77  b->nCol + regRow
a2a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
a2b0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
a2c0: 20 30 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f   0, iDb, pTab, O
a2d0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
a2e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
a2f0: 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52  adString(v, regR
a300: 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  esult, pTab->zNa
a310: 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  me);.      for(i
a320: 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46  =1, pFK=pTab->pF
a330: 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70  Key; pFK; i++, p
a340: 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f  FK=pFK->pNextFro
a350: 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72  m){.        pPar
a360: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ent = sqlite3Fin
a370: 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e  dTable(db, pFK->
a380: 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20  zTo, zDb);.     
a390: 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d     if( pParent==
a3a0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
a3b0: 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
a3c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
a3d0: 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
a3e0: 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74   iDb, pParent->t
a3f0: 6e 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d  num, 0, pParent-
a400: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
a410: 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f   x = sqlite3FkLo
a420: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
a430: 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20  , pParent, pFK, 
a440: 26 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20  &pIdx, 0);.     
a450: 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20     if( x==0 ){. 
a460: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
a470: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
a480: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
a490: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20  able(pParse, i, 
a4a0: 69 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50  iDb, pParent, OP
a4b0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
a4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a4d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a4e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a4f0: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49  _OpenRead, i, pI
a500: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
a510: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a520: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
a530: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
a540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
a550: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a560: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
a570: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a580: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a590: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a5a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c  pParse->nErr>0 |
a5b0: 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20  | pFK==0 );.    
a5c0: 20 20 69 66 28 20 70 46 4b 20 29 20 62 72 65 61    if( pFK ) brea
a5d0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  k;.      if( pPa
a5e0: 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50  rse->nTab<i ) pP
a5f0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a  arse->nTab = i;.
a600: 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20        addrTop = 
a610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a620: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
a630: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
a640: 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  (v);.      for(i
a650: 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46  =1, pFK=pTab->pF
a660: 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70  Key; pFK; i++, p
a670: 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f  FK=pFK->pNextFro
a680: 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72  m){.        pPar
a690: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ent = sqlite3Fin
a6a0: 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e  dTable(db, pFK->
a6b0: 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20  zTo, zDb);.     
a6c0: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20     pIdx = 0;.   
a6d0: 20 20 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b       aiCols = 0;
a6e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
a6f0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
a700: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c    x = sqlite3FkL
a710: 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  ocateIndex(pPars
a720: 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c  e, pParent, pFK,
a730: 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29   &pIdx, &aiCols)
a740: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
a750: 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( x==0 );.    
a760: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
a770: 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  drOk = sqlite3Vd
a780: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
a790: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a7a0: 65 6e 74 20 26 26 20 70 49 64 78 3d 3d 30 20 29  ent && pIdx==0 )
a7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
a7c0: 69 4b 65 79 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c  iKey = pFK->aCol
a7d0: 5b 30 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20  [0].iFrom;.     
a7e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4b 65       assert( iKe
a7f0: 79 3e 3d 30 20 26 26 20 69 4b 65 79 3c 70 54 61  y>=0 && iKey<pTa
a800: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
a810: 20 20 20 20 20 69 66 28 20 69 4b 65 79 21 3d 70       if( iKey!=p
a820: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
a830: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a840: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a850: 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 69 4b 65  P_Column, 0, iKe
a860: 79 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  y, regRow);.    
a870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
a880: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
a890: 70 54 61 62 2c 20 69 4b 65 79 2c 20 72 65 67 52  pTab, iKey, regR
a8a0: 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ow);.           
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8c0: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
a8d0: 20 72 65 67 52 6f 77 2c 20 61 64 64 72 4f 6b 29   regRow, addrOk)
a8e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
a900: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a920: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30  2(v, OP_Rowid, 0
a930: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20  , regRow);.     
a940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a950: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a960: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
a970: 69 64 2c 20 69 2c 20 30 2c 20 72 65 67 52 6f 77  id, i, 0, regRow
a980: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a990: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
a9a0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
a9b0: 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20   addrOk);.      
a9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
a9d0: 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74  umpHere(v, sqlit
a9e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a9f0: 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 20  r(v)-2);.       
aa00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aa10: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b    for(j=0; j<pFK
aa20: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
aa30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aa40: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
aa50: 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
aa60: 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  b, 0,.          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c    aiCols ? aiCol
aa90: 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c  s[j] : pFK->aCol
aaa0: 5b 6a 5d 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f  [j].iFrom, regRo
aab0: 77 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w+j);.          
aac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
aad0: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
aae0: 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72  , regRow+j, addr
aaf0: 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ok); VdbeCoverag
ab00: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
ab10: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
ab20: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
ab30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ab40: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
ab50: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
ab60: 77 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65  w, pFK->nCol, re
ab70: 67 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  gKey,.          
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
aba0: 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70  AffinityStr(db,p
abb0: 49 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29  Idx), pFK->nCol)
abc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
abd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
abe0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
abf0: 69 2c 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65  i, addrOk, regKe
ac00: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
ac10: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
ac20: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
ac30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ac40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac50: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
ac60: 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29   0, regResult+1)
ac70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ac80: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
ac90: 2c 20 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22  , regResult+2, "
aca0: 73 69 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69  si", pFK->zTo, i
acb0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
acc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
acd0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
ace0: 72 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20  regResult, 4);. 
acf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad00: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ad10: 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20  , addrOk);.     
ad20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ad30: 28 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20  (db, aiCols);.  
ad40: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ad50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ad60: 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64   OP_Next, 0, add
ad70: 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rTop+1); VdbeCov
ad80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ad90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ada0: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
adb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
adc0: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ak;.#endif /* !d
add0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ade0: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23  IT_TRIGGER) */.#
adf0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
ae00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
ae10: 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23  REIGN_KEY) */..#
ae20: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
ae30: 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 52  case PragTyp_PAR
ae40: 53 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20  SER_TRACE: {.   
ae50: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
ae60: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ae70: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
ae80: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t, 0) ){.       
ae90: 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72   sqlite3ParserTr
aea0: 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72  ace(stdout, "par
aeb0: 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d  ser: ");.      }
aec0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
aed0: 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65  lite3ParserTrace
aee0: 28 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  (0, 0);.      }.
aef0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
af00: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  k;.#endif..  /* 
af10: 52 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49  Reinstall the LI
af20: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63  KE and GLOB func
af30: 74 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69  tions.  The vari
af40: 61 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a  ant of LIKE.  **
af50: 20 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61   used will be ca
af60: 73 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20  se sensitive or 
af70: 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  not depending on
af80: 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
af90: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41   case PragTyp_CA
afa0: 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b  SE_SENSITIVE_LIK
afb0: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  E: {.    if( zRi
afc0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
afd0: 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65  ite3RegisterLike
afe0: 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71  Functions(db, sq
aff0: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
b000: 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20  zRight, 0));.   
b010: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b020: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b030: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
b040: 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69  ERROR_MAX.# defi
b050: 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52  ne SQLITE_INTEGR
b060: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
b070: 4d 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a  MAX 100.#endif..
b080: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b090: 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
b0a0: 45 43 4b 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20  ECK.  /* Pragma 
b0b0: 22 71 75 69 63 6b 5f 63 68 65 63 6b 22 20 69 73  "quick_check" is
b0c0: 20 72 65 64 75 63 65 64 20 76 65 72 73 69 6f 6e   reduced version
b0d0: 20 6f 66 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72   of .  ** integr
b0e0: 69 74 79 5f 63 68 65 63 6b 20 64 65 73 69 67 6e  ity_check design
b0f0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 6d 6f 73  ed to detect mos
b100: 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  t database corru
b110: 70 74 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f  ption.  ** witho
b120: 75 74 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 6f  ut most of the o
b130: 76 65 72 68 65 61 64 20 6f 66 20 61 20 66 75 6c  verhead of a ful
b140: 6c 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  l integrity-chec
b150: 6b 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  k..  */.  case P
b160: 72 61 67 54 79 70 5f 49 4e 54 45 47 52 49 54 59  ragTyp_INTEGRITY
b170: 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 69 6e  _CHECK: {.    in
b180: 74 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78  t i, j, addr, mx
b190: 45 72 72 3b 0a 0a 20 20 20 20 69 6e 74 20 69 73  Err;..    int is
b1a0: 51 75 69 63 6b 20 3d 20 28 73 71 6c 69 74 65 33  Quick = (sqlite3
b1b0: 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d  Tolower(zLeft[0]
b1c0: 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20 20 2f 2a  )=='q');..    /*
b1d0: 20 49 66 20 74 68 65 20 50 52 41 47 4d 41 20 63   If the PRAGMA c
b1e0: 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66 20 74 68  ommand was of th
b1f0: 65 20 66 6f 72 6d 20 22 50 52 41 47 4d 41 20 3c  e form "PRAGMA <
b200: 64 62 3e 2e 69 6e 74 65 67 72 69 74 79 5f 63 68  db>.integrity_ch
b210: 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  eck",.    ** the
b220: 6e 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20  n iDb is set to 
b230: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
b240: 20 64 61 74 61 62 61 73 65 20 69 64 65 6e 74 69   database identi
b250: 66 69 65 64 20 62 79 20 3c 64 62 3e 2e 0a 20 20  fied by <db>..  
b260: 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
b270: 65 2c 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  e, the integrity
b280: 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 44 62   of database iDb
b290: 20 6f 6e 6c 79 20 69 73 20 76 65 72 69 66 69 65   only is verifie
b2a0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  d by.    ** the 
b2b0: 56 44 42 45 20 63 72 65 61 74 65 64 20 62 65 6c  VDBE created bel
b2c0: 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
b2d0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
b2e0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  the command was 
b2f0: 73 69 6d 70 6c 79 20 22 50 52 41 47 4d 41 20 69  simply "PRAGMA i
b300: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 20  ntegrity_check" 
b310: 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50 52 41 47  (or.    ** "PRAG
b320: 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 22 29  MA quick_check")
b330: 2c 20 74 68 65 6e 20 69 44 62 20 69 73 20 73 65  , then iDb is se
b340: 74 20 74 6f 20 30 2e 20 49 6e 20 74 68 69 73 20  t to 0. In this 
b350: 63 61 73 65 2c 20 73 65 74 20 69 44 62 0a 20 20  case, set iDb.  
b360: 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65 72 65 2c    ** to -1 here,
b370: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
b380: 74 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  t the VDBE shoul
b390: 64 20 76 65 72 69 66 79 20 74 68 65 20 69 6e 74  d verify the int
b3a0: 65 67 72 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66  egrity.    ** of
b3b0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
b3c0: 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a 20 20 20  tabases.  */.   
b3d0: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
b3e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
b3f0: 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32 2d 3e 7a  Db==0 || pId2->z
b400: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 32   );.    if( pId2
b410: 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20 3d 20 2d  ->z==0 ) iDb = -
b420: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  1;..    /* Initi
b430: 61 6c 69 7a 65 20 74 68 65 20 56 44 42 45 20 70  alize the VDBE p
b440: 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20 70 50  rogram */.    pP
b450: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a  arse->nMem = 6;.
b460: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
b470: 6d 61 78 69 6d 75 6d 20 65 72 72 6f 72 20 63 6f  maximum error co
b480: 75 6e 74 20 2a 2f 0a 20 20 20 20 6d 78 45 72 72  unt */.    mxErr
b490: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52   = SQLITE_INTEGR
b4a0: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
b4b0: 4d 41 58 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  MAX;.    if( zRi
b4c0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
b4d0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
b4e0: 67 68 74 2c 20 26 6d 78 45 72 72 29 3b 0a 20 20  ght, &mxErr);.  
b4f0: 20 20 20 20 69 66 28 20 6d 78 45 72 72 3c 3d 30      if( mxErr<=0
b500: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 45 72   ){.        mxEr
b510: 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  r = SQLITE_INTEG
b520: 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52  RITY_CHECK_ERROR
b530: 5f 4d 41 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _MAX;.      }.  
b540: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b550: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b560: 49 6e 74 65 67 65 72 2c 20 6d 78 45 72 72 2c 20  Integer, mxErr, 
b570: 31 29 3b 20 20 2f 2a 20 72 65 67 5b 31 5d 20 68  1);  /* reg[1] h
b580: 6f 6c 64 73 20 65 72 72 6f 72 73 20 6c 65 66 74  olds errors left
b590: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61   */..    /* Do a
b5a0: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
b5b0: 6b 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  k on each databa
b5c0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66  se file */.    f
b5d0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
b5e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48  b; i++){.      H
b5f0: 61 73 68 45 6c 65 6d 20 2a 78 3b 0a 20 20 20 20  ashElem *x;.    
b600: 20 20 48 61 73 68 20 2a 70 54 62 6c 73 3b 0a 20    Hash *pTbls;. 
b610: 20 20 20 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b       int *aRoot;
b620: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
b630: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   0;.      int mx
b640: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Idx = 0;.      i
b650: 6e 74 20 6e 49 64 78 3b 0a 0a 20 20 20 20 20 20  nt nIdx;..      
b660: 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20  if( OMIT_TEMPDB 
b670: 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  && i==1 ) contin
b680: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44  ue;.      if( iD
b690: 62 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20 29  b>=0 && i!=iDb )
b6a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
b6b0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
b6c0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
b6d0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , i);.      addr
b6e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b6f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
b700: 2c 20 31 29 3b 20 2f 2a 20 48 61 6c 74 20 69 66  , 1); /* Halt if
b710: 20 6f 75 74 20 6f 66 20 65 72 72 6f 72 73 20 2a   out of errors *
b720: 2f 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  /.      VdbeCove
b730: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
b740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b750: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
b760: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b770: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b780: 20 61 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f   addr);..      /
b790: 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74  * Do an integrit
b7a0: 79 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 42  y check of the B
b7b0: 2d 54 72 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20  -Tree.      **. 
b7c0: 20 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 62 79       ** Begin by
b7d0: 20 66 69 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f   finding the roo
b7e0: 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 0a  t pages numbers.
b7f0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c        ** for all
b800: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
b810: 63 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ces in the datab
b820: 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
b830: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
b840: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
b850: 6c 64 28 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a  ld(db, i, 0) );.
b860: 20 20 20 20 20 20 70 54 62 6c 73 20 3d 20 26 64        pTbls = &d
b870: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
b880: 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20  a->tblHash;.    
b890: 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73    for(cnt=0, x=s
b8a0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
b8b0: 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Tbls); x; x=sqli
b8c0: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
b8d0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
b8e0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
b8f0: 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20  Data(x);.       
b900: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
b910: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
b920: 69 64 28 70 54 61 62 29 20 29 20 63 6e 74 2b 2b  id(pTab) ) cnt++
b930: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e 49  ;.        for(nI
b940: 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  dx=0, pIdx=pTab-
b950: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
b960: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
b970: 20 6e 49 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b 3b   nIdx++){ cnt++;
b980: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
b990: 49 64 78 3e 6d 78 49 64 78 20 29 20 6d 78 49 64  Idx>mxIdx ) mxId
b9a0: 78 20 3d 20 6e 49 64 78 3b 0a 20 20 20 20 20 20  x = nIdx;.      
b9b0: 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74 20 3d 20  }.      aRoot = 
b9c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b9d0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
b9e0: 69 6e 74 29 2a 28 63 6e 74 2b 31 29 29 3b 0a 20  int)*(cnt+1));. 
b9f0: 20 20 20 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d       if( aRoot==
ba00: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ba10: 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71   for(cnt=0, x=sq
ba20: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54  liteHashFirst(pT
ba30: 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74  bls); x; x=sqlit
ba40: 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20  eHashNext(x)){. 
ba50: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
ba60: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
ba70: 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20  ata(x);.        
ba80: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
ba90: 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
baa0: 64 28 70 54 61 62 29 20 29 20 61 52 6f 6f 74 5b  d(pTab) ) aRoot[
bab0: 63 6e 74 2b 2b 5d 20 3d 20 70 54 61 62 2d 3e 74  cnt++] = pTab->t
bac0: 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  num;.        for
bad0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
bae0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
baf0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
bb00: 20 20 20 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74         aRoot[cnt
bb10: 2b 2b 5d 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  ++] = pIdx->tnum
bb20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bb30: 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b    }.      aRoot[
bb40: 63 6e 74 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 20  cnt] = 0;..     
bb50: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 73 75   /* Make sure su
bb60: 66 66 69 63 69 65 6e 74 20 6e 75 6d 62 65 72 20  fficient number 
bb70: 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 61 76  of registers hav
bb80: 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
bb90: 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65   */.      pParse
bba0: 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 20 70 50  ->nMem = MAX( pP
bbb0: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d 78  arse->nMem, 8+mx
bbc0: 49 64 78 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Idx );..      /*
bbd0: 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20 69   Do the b-tree i
bbe0: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 20  ntegrity checks 
bbf0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
bc00: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
bc10: 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32 2c  _IntegrityCk, 2,
bc20: 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a 29   cnt, 1, (char*)
bc30: 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41  aRoot,P4_INTARRA
bc40: 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Y);.      sqlite
bc50: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
bc60: 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20 61   (u8)i);.      a
bc70: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bc80: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
bc90: 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f  Null, 2); VdbeCo
bca0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
bcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bcc0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
bcd0: 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20  , 0, 3, 0,.     
bce0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
bcf0: 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64  tf(db, "*** in d
bd00: 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e  atabase %s ***\n
bd10: 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  ", db->aDb[i].zD
bd20: 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  bSName),.       
bd30: 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20    P4_DYNAMIC);. 
bd40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd50: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp3(v, OP_Mov
bd60: 65 2c 20 32 2c 20 34 2c 20 31 29 3b 0a 20 20 20  e, 2, 4, 1);.   
bd70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bd80: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
bd90: 74 2c 20 34 2c 20 33 2c 20 32 29 3b 0a 20 20 20  t, 4, 3, 2);.   
bda0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bdb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
bdc0: 74 52 6f 77 2c 20 32 2c 20 31 29 3b 0a 20 20 20  tRow, 2, 1);.   
bdd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
bde0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
bdf0: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  ..      /* Make 
be00: 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64  sure all the ind
be10: 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75  ices are constru
be20: 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  cted correctly..
be30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
be40: 6f 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46  or(x=sqliteHashF
be50: 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 20 26  irst(pTbls); x &
be60: 26 20 21 69 73 51 75 69 63 6b 3b 20 78 3d 73 71  & !isQuick; x=sq
be70: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29  liteHashNext(x))
be80: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
be90: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
bea0: 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20  shData(x);.     
beb0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20     Index *pIdx, 
bec0: 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e  *pPk;.        In
bed0: 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b  dex *pPrior = 0;
bee0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f  .        int loo
bef0: 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  pTop;.        in
bf00: 74 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78  t iDataCur, iIdx
bf10: 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Cur;.        int
bf20: 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20   r1 = -1;..     
bf30: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e     if( pTab->pIn
bf40: 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dex==0 ) continu
bf50: 65 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 20 3d  e;.        pPk =
bf60: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
bf70: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50 72 69  ? 0 : sqlite3Pri
bf80: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
bf90: 62 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  b);.        addr
bfa0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bfb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
bfc0: 2c 20 31 29 3b 20 20 2f 2a 20 53 74 6f 70 20 69  , 1);  /* Stop i
bfd0: 66 20 6f 75 74 20 6f 66 20 65 72 72 6f 72 73 20  f out of errors 
bfe0: 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  */.        VdbeC
bff0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c010: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
c020: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
c030: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c040: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
c050: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c060: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
c070: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
c080: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e  lite3OpenTableAn
c090: 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c  dIndices(pParse,
c0a0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
c0b0: 61 64 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ad, 0,.         
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
c0e0: 26 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78  &iDataCur, &iIdx
c0f0: 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cur);.        sq
c100: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c110: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c120: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 7);.        fo
c130: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
c140: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
c150: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
c160: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
c170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c180: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
c190: 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69  r, 0, 8+j); /* i
c1a0: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75  ndex entries cou
c1b0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  nter */.        
c1c0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
c1d0: 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d  ( pParse->nMem>=
c1e0: 38 2b 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61  8+j );.        a
c1f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f  ssert( sqlite3No
c200: 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61  TempsInRange(pPa
c210: 72 73 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20  rse,1,7+j) );.  
c220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c230: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
c240: 77 69 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  wind, iDataCur, 
c250: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
c260: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f  (v);.        loo
c270: 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  pTop = sqlite3Vd
c280: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
c290: 64 64 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20  ddImm, 7, 1);.  
c2a0: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
c2b0: 74 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c  that all NOT NUL
c2c0: 4c 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79  L columns really
c2d0: 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f   are NOT NULL */
c2e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
c2f0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
c300: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
c310: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
c320: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20        int jmp2, 
c330: 6a 6d 70 33 3b 0a 20 20 20 20 20 20 20 20 20 20  jmp3;.          
c340: 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
c350: 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
c360: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61           if( pTa
c370: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
c380: 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ll==0 ) continue
c390: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c3a0: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
c3b0: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
c3c0: 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 6a  Tab, iDataCur, j
c3d0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
c3e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
c3f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
c400: 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
c410: 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74      jmp2 = sqlit
c420: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c430: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20  OP_NotNull, 3); 
c440: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c450: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c460: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c470: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31  OP_AddImm, 1, -1
c480: 29 3b 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  ); /* Decrement 
c490: 65 72 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20  error limit */. 
c4a0: 20 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20           zErr = 
c4b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c4c0: 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69  b, "NULL value i
c4d0: 6e 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e  n %s.%s", pTab->
c4e0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
c510: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  j].zName);.     
c520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c530: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
c540: 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a  ing8, 0, 3, 0, z
c550: 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Err, P4_DYNAMIC)
c560: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c570: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c580: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 33   OP_ResultRow, 3
c590: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
c5a0: 6a 6d 70 33 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp3 = sqlite3Vd
c5b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c5c0: 66 50 6f 73 2c 20 31 29 3b 20 56 64 62 65 43 6f  fPos, 1); VdbeCo
c5d0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5f0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c  AddOp0(v, OP_Hal
c600: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
c610: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c620: 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20  e(v, jmp2);.    
c630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c640: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
c650: 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  3);.        }.  
c660: 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74        /* Validat
c670: 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
c680: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
c690: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  row */.        f
c6a0: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
c6b0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
c6c0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
c6d0: 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, j++){.       
c6e0: 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70     int jmp2, jmp
c6f0: 33 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20  3, jmp4, jmp5;. 
c700: 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6b 55           int ckU
c710: 6e 69 71 20 3d 20 73 71 6c 69 74 65 33 56 64 62  niq = sqlite3Vdb
c720: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
c730: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b           if( pPk
c740: 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  ==pIdx ) continu
c750: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  e;.          r1 
c760: 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
c770: 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
c780: 2c 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72  , pIdx, iDataCur
c790: 2c 20 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20  , 0, 0, &jmp3,. 
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 72 31        pPrior, r1
c7d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  );.          pPr
c7e0: 69 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  ior = pIdx;.    
c7f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c800: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
c810: 64 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 20 20  dImm, 8+j, 1);  
c820: 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74  /* increment ent
c830: 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  ry count */.    
c840: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
c850: 74 68 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  that an index en
c860: 74 72 79 20 65 78 69 73 74 73 20 66 6f 72 20 74  try exists for t
c870: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
c880: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
c890: 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33    jmp2 = sqlite3
c8a0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
c8b0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43   OP_Found, iIdxC
c8c0: 75 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31  ur+j, ckUniq, r1
c8d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43          pIdx->nC
c900: 6f 6c 75 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65  olumn); VdbeCove
c910: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
c920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c930: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
c940: 6d 2c 20 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65  m, 1, -1); /* De
c950: 63 72 65 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69  crement error li
c960: 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mit */.         
c970: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
c980: 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f  String(v, 3, "ro
c990: 77 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w ");.          
c9a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c9b0: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
c9c0: 37 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  7, 3, 3);.      
c9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
c9e0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20  oadString(v, 4, 
c9f0: 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69  " missing from i
ca00: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
ca10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca20: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
ca30: 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20  t, 4, 3, 3);.   
ca40: 20 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71         jmp5 = sq
ca50: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
ca60: 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e  ing(v, 4, pIdx->
ca70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
ca80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca90: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
caa0: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
cab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cac0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
cad0: 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a  sultRow, 3, 1);.
cae0: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 34 20 3d            jmp4 =
caf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb00: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
cb10: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
cb20: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
cb30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
cb40: 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20  (v, OP_Halt);.  
cb50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cb60: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
cb70: 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mp2);.          
cb80: 2f 2a 20 46 6f 72 20 55 4e 49 51 55 45 20 69 6e  /* For UNIQUE in
cb90: 64 65 78 65 73 2c 20 76 65 72 69 66 79 20 74 68  dexes, verify th
cba0: 61 74 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72  at only one entr
cbb0: 79 20 65 78 69 73 74 73 20 77 69 74 68 20 74 68  y exists with th
cbc0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
cbd0: 75 72 72 65 6e 74 20 6b 65 79 2e 20 20 54 68 65  urrent key.  The
cbe0: 20 65 6e 74 72 79 20 69 73 20 75 6e 69 71 75 65   entry is unique
cbf0: 20 69 66 20 28 31 29 20 61 6e 79 20 63 6f 6c 75   if (1) any colu
cc00: 6d 6e 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20  mn is NULL.     
cc10: 20 20 20 20 20 2a 2a 20 6f 72 20 28 32 29 20 74       ** or (2) t
cc20: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 68 61  he next entry ha
cc30: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 65  s a different ke
cc40: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  y */.          i
cc50: 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
cc60: 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  (pIdx) ){.      
cc70: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b        int uniqOk
cc80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
cc90: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
cca0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 36          int jmp6
ccb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
ccc0: 74 20 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  t kk;.          
ccd0: 20 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70    for(kk=0; kk<p
cce0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b  Idx->nKeyCol; kk
ccf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
cd00: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
cd10: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d  dx->aiColumn[kk]
cd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
cd30: 61 73 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e  assert( iCol!=XN
cd40: 5f 52 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70  _ROWID && iCol<p
cd50: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
cd60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
cd70: 43 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e  Col>=0 && pTab->
cd80: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
cd90: 6c 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ll ) continue;. 
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
cdb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cdc0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b  , OP_IsNull, r1+
cdd0: 6b 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20  kk, uniqOk);.   
cde0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
cdf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
ce00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ce10: 20 20 20 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c        jmp6 = sql
ce20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ce30: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43  , OP_Next, iIdxC
ce40: 75 72 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65 72  ur+j); VdbeCover
ce50: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
ce60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
ce70: 6f 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a  oto(v, uniqOk);.
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ce90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
cea0: 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20  v, jmp6);.      
ceb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cec0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
ced0: 5f 49 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b  _IdxGT, iIdxCur+
cee0: 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20  j, uniqOk, r1,. 
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20  pIdx->nKeyCol); 
cf20: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cf30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
cf40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cf50: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
cf60: 2d 31 29 3b 20 2f 2a 20 44 65 63 72 65 6d 65 6e  -1); /* Decremen
cf70: 74 20 65 72 72 6f 72 20 6c 69 6d 69 74 20 2a 2f  t error limit */
cf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
cf90: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
cfa0: 6e 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e  ng(v, 3, "non-un
cfb0: 69 71 75 65 20 65 6e 74 72 79 20 69 6e 20 69 6e  ique entry in in
cfc0: 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20  dex ");.        
cfd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
cfe0: 6f 74 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20  oto(v, jmp5);.  
cff0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d000: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d010: 6c 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20  l(v, uniqOk);.  
d020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d030: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d040: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29  umpHere(v, jmp4)
d050: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d060: 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64  te3ResolvePartId
d070: 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 6a  xLabel(pParse, j
d080: 6d 70 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mp3);.        }.
d090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d0a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d0b0: 4e 65 78 74 2c 20 69 44 61 74 61 43 75 72 2c 20  Next, iDataCur, 
d0c0: 6c 6f 6f 70 54 6f 70 29 3b 20 56 64 62 65 43 6f  loopTop); VdbeCo
d0d0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d0e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d0f0: 6d 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f  mpHere(v, loopTo
d100: 70 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  p-1);.#ifndef SQ
d110: 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
d120: 4f 55 4e 54 0a 20 20 20 20 20 20 20 20 73 71 6c  OUNT.        sql
d130: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
d140: 6e 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20  ng(v, 2, "wrong 
d150: 23 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  # of entries in 
d160: 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20  index ");.      
d170: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d    for(j=0, pIdx=
d180: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d190: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d1a0: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
d1b0: 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70        if( pPk==p
d1c0: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
d1d0: 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
d1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d1f0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d210: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
d220: 50 6f 73 2c 20 31 2c 20 61 64 64 72 2b 32 29 3b  Pos, 1, addr+2);
d230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d240: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d250: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d260: 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b   OP_Halt, 0, 0);
d270: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d280: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d290: 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75  OP_Count, iIdxCu
d2a0: 72 2b 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  r+j, 3);.       
d2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d2c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38  dOp3(v, OP_Eq, 8
d2d0: 2b 6a 2c 20 61 64 64 72 2b 38 2c 20 33 29 3b 20  +j, addr+8, 3); 
d2e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d2f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d300: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
d310: 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c  , SQLITE_NOTNULL
d320: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d340: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20  , OP_AddImm, 1, 
d350: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  -1);.          s
d360: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
d370: 72 69 6e 67 28 76 2c 20 33 2c 20 70 49 64 78 2d  ring(v, 3, pIdx-
d380: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
d390: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d3a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
d3b0: 74 2c 20 33 2c 20 32 2c 20 37 29 3b 0a 20 20 20  t, 3, 2, 7);.   
d3c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d3d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
d3e0: 65 73 75 6c 74 52 6f 77 2c 20 37 2c 20 31 29 3b  esultRow, 7, 1);
d3f0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
d400: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d410: 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
d420: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20       } .    }.  
d430: 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63    {.      static
d440: 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d   const int iLn =
d450: 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e   VDBE_OFFSET_LIN
d460: 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74  ENO(2);.      st
d470: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
d480: 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20  pList endCode[] 
d490: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
d4a0: 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c  _AddImm,      1,
d4b0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
d4c0: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
d4d0: 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20 20    { OP_If,      
d4e0: 20 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20      1, 4,       
d4f0: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
d500: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
d510: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
d520: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
d530: 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   2 */.        { 
d540: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
d550: 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  3, 1,        0},
d560: 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20      /* 3 */.    
d570: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
d580: 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61  p *aOp;..      a
d590: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
d5a0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
d5b0: 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c  aySize(endCode),
d5c0: 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a   endCode, iLn);.
d5d0: 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b        if( aOp ){
d5e0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
d5f0: 70 32 20 3d 20 2d 6d 78 45 72 72 3b 0a 20 20 20  p2 = -mxErr;.   
d600: 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74 79       aOp[2].p4ty
d610: 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a  pe = P4_STATIC;.
d620: 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70          aOp[2].p
d630: 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20  4.z = "ok";.    
d640: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d650: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
d660: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
d670: 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
d680: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d690: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a  OMIT_UTF16.  /*.
d6a0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e    **   PRAGMA en
d6b0: 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52  coding.  **   PR
d6c0: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
d6d0: 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22  "utf-8"|"utf-16"
d6e0: 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66  |"utf-16le"|"utf
d6f0: 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  -16be".  **.  **
d700: 20 49 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f   In its first fo
d710: 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20  rm, this pragma 
d720: 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f  returns the enco
d730: 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e  ding of the main
d740: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
d750: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d760: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  is not initializ
d770: 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61  ed, it is initia
d780: 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a  lized now..  **.
d790: 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
d7a0: 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61  form of this pra
d7b0: 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  gma is a no-op i
d7c0: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
d7d0: 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61  ase file.  ** ha
d7e0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
d7f0: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  en initialized. 
d800: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
d810: 73 65 74 73 20 74 68 65 20 64 65 66 61 75 6c 74  sets the default
d820: 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74  .  ** encoding t
d830: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
d840: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
d850: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 61  tabase file if a
d860: 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69   new file.  ** i
d870: 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e  s created. If an
d880: 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64   existing main d
d890: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
d8a0: 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  opened, then the
d8b0: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65  .  ** default te
d8c0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  xt encoding for 
d8d0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
d8e0: 61 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20  abase is used.. 
d8f0: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c   ** .  ** In all
d900: 20 63 61 73 65 73 20 6e 65 77 20 64 61 74 61 62   cases new datab
d910: 61 73 65 73 20 63 72 65 61 74 65 64 20 75 73 69  ases created usi
d920: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
d930: 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63  mmand are.  ** c
d940: 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68  reated to use th
d950: 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74  e same default t
d960: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20  ext encoding as 
d970: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
d980: 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  e. If.  ** the m
d990: 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73  ain database has
d9a0: 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61   not been initia
d9b0: 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65  lized and/or cre
d9c0: 61 74 65 64 20 77 68 65 6e 20 41 54 54 41 43 48  ated when ATTACH
d9d0: 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65  .  ** is execute
d9e0: 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  d, this is done 
d9f0: 62 65 66 6f 72 65 20 74 68 65 20 41 54 54 41 43  before the ATTAC
da00: 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a  H operation..  *
da10: 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65  *.  ** In the se
da20: 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70  cond form this p
da30: 72 61 67 6d 61 20 73 65 74 73 20 74 68 65 20 74  ragma sets the t
da40: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20  ext encoding to 
da50: 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20  be used in.  ** 
da60: 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c  new database fil
da70: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
da80: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68   this database h
da90: 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c  andle. It is onl
daa0: 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66  y.  ** useful if
dab0: 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61   invoked immedia
dac0: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d  tely after the m
dad0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20  ain database i. 
dae0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
daf0: 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20  yp_ENCODING: {. 
db00: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
db10: 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b  struct EncName {
db20: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
db30: 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63  me;.      u8 enc
db40: 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73  ;.    } encnames
db50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
db60: 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54  UTF8",     SQLIT
db70: 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c  E_UTF8        },
db80: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22  .      { "UTF-8"
db90: 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38  ,    SQLITE_UTF8
dba0: 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d          },  /* M
dbb0: 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b  ust be element [
dbc0: 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  1] */.      { "U
dbd0: 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45  TF-16le", SQLITE
dbe0: 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20  _UTF16LE     }, 
dbf0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d   /* Must be elem
dc00: 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20  ent [2] */.     
dc10: 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53   { "UTF-16be", S
dc20: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20  QLITE_UTF16BE   
dc30: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
dc40: 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a   element [3] */.
dc50: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65        { "UTF16le
dc60: 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ",  SQLITE_UTF16
dc70: 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  LE     },.      
dc80: 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20 53 51  { "UTF16be",  SQ
dc90: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20  LITE_UTF16BE    
dca0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
dcb0: 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20 20 20  -16",   0       
dcc0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a             }, /*
dcd0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
dce0: 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  IVE */.      { "
dcf0: 55 54 46 31 36 22 2c 20 20 20 20 30 20 20 20 20  UTF16",    0    
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
dd10: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   /* SQLITE_UTF16
dd20: 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20  NATIVE */.      
dd30: 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a  { 0, 0 }.    };.
dd40: 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
dd50: 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a   EncName *pEnc;.
dd60: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
dd70: 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41  ){    /* "PRAGMA
dd80: 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20   encoding" */.  
dd90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
dda0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
ddb0: 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f  ) ) goto pragma_
ddc0: 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  out;.      asser
ddd0: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
dde0: 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51  TE_UTF8].enc==SQ
ddf0: 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20  LITE_UTF8 );.   
de00: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
de10: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mes[SQLITE_UTF16
de20: 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  LE].enc==SQLITE_
de30: 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20  UTF16LE );.     
de40: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
de50: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  s[SQLITE_UTF16BE
de60: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
de70: 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72  F16BE );.      r
de80: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
de90: 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28  v, encnames[ENC(
dea0: 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61  pParse->db)].zNa
deb0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  me);.    }else{ 
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d         /* "PRAGM
dee0: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58  A encoding = XXX
def0: 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  " */.      /* On
df00: 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  ly change the va
df10: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e  lue of sqlite.en
df20: 63 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  c if the databas
df30: 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a  e handle is not.
df40: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
df50: 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69  ized. If the mai
df60: 6e 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  n database exist
df70: 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  s, the new sqlit
df80: 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20  e.enc value.    
df90: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65    ** will be ove
dfa0: 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68  rwritten when th
dfb0: 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74  e schema is next
dfc0: 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64   loaded. If it d
dfd0: 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
dfe0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c   already exists,
dff0: 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61   it will be crea
e000: 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e  ted to use the n
e010: 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75  ew encoding valu
e020: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
e030: 20 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 21    if( .        !
e040: 28 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  (DbHasProperty(d
e050: 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
e060: 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20  oaded)) || .    
e070: 20 20 20 20 44 62 48 61 73 50 72 6f 70 65 72 74      DbHasPropert
e080: 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74  y(db, 0, DB_Empt
e090: 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  y) .      ){.   
e0a0: 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65       for(pEnc=&e
e0b0: 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63  ncnames[0]; pEnc
e0c0: 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29  ->zName; pEnc++)
e0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
e0e0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
e0f0: 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e  p(zRight, pEnc->
e100: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
e110: 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
e120: 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d  (db) = ENC(db) =
e130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e140: 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e   pEnc->enc ? pEn
e150: 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f  c->enc : SQLITE_
e160: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
e170: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e180: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e190: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e1a0: 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29  ( !pEnc->zName )
e1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e1c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e1d0: 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64  se, "unsupported
e1e0: 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20   encoding: %s", 
e1f0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  zRight);.       
e200: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e210: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
e220: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e230: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
e240: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e250: 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  T_SCHEMA_VERSION
e260: 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20  _PRAGMAS.  /*.  
e270: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
e280: 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73  ema.]schema_vers
e290: 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ion.  **   PRAGM
e2a0: 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d  A [schema.]schem
e2b0: 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74  a_version = <int
e2c0: 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger>.  **.  ** 
e2d0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e2e0: 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20  .]user_version. 
e2f0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
e300: 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69  hema.]user_versi
e310: 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  on = <integer>. 
e320: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e330: 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c  A [schema.]freel
e340: 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20  ist_count.  **. 
e350: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
e360: 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69  hema.]data_versi
e370: 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  on.  **.  **   P
e380: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
e390: 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20  pplication_id.  
e3a0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
e3b0: 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e  ema.]application
e3c0: 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  _id = <integer>.
e3d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72    **.  ** The pr
e3e0: 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65  agma's schema_ve
e3f0: 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76  rsion and user_v
e400: 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20  ersion are used 
e410: 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20  to set or get.  
e420: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
e430: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
e440: 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73  on and user-vers
e450: 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ion, respectivel
e460: 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65  y. Both.  ** the
e470: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
e480: 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65 72  and the user-ver
e490: 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20  sion are 32-bit 
e4a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a  signed integers.
e4b0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
e4c0: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
e4d0: 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
e4e0: 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  e schema-cookie 
e4f0: 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20  is usually only 
e500: 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65  manipulated inte
e510: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
e520: 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63  . It.  ** is inc
e530: 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69  remented by SQLi
e540: 74 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  te whenever the 
e550: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
e560: 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a  is modified (by.
e570: 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72    ** creating or
e580: 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c   dropping a tabl
e590: 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65  e or index). The
e5a0: 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
e5b0: 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  is used by.  ** 
e5c0: 53 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65  SQLite each time
e5d0: 20 61 20 71 75 65 72 79 20 69 73 20 65 78 65 63   a query is exec
e5e0: 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  uted to ensure t
e5f0: 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
e600: 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74   cache.  ** of t
e610: 68 65 20 73 63 68 65 6d 61 20 75 73 65 64 20 77  he schema used w
e620: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  hen compiling th
e630: 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63  e SQL query matc
e640: 68 65 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f  hes the schema o
e650: 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
e660: 61 73 65 20 61 67 61 69 6e 73 74 20 77 68 69 63  ase against whic
e670: 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71  h the compiled q
e680: 75 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79  uery is actually
e690: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20   executed..  ** 
e6a0: 53 75 62 76 65 72 74 69 6e 67 20 74 68 69 73 20  Subverting this 
e6b0: 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69  mechanism by usi
e6c0: 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d  ng "PRAGMA schem
e6d0: 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f  a_version" to mo
e6e0: 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
e6f0: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20  hema-version is 
e700: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67  potentially dang
e710: 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65  erous and may le
e720: 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20  ad to program.  
e730: 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64 61  ** crashes or da
e740: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
e750: 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61 75 74  n. Use with caut
e760: 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ion!.  **.  ** T
e770: 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20  he user-version 
e780: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
e790: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
e7a0: 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73 65 64  . It may be used
e7b0: 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61   by.  ** applica
e7c0: 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75  tions for any pu
e7d0: 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  rpose..  */.  ca
e7e0: 73 65 20 50 72 61 67 54 79 70 5f 48 45 41 44 45  se PragTyp_HEADE
e7f0: 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  R_VALUE: {.    i
e800: 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72  nt iCookie = pPr
e810: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20  agma->iArg;  /* 
e820: 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20  Which cookie to 
e830: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f  read or write */
e840: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e850: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
e860: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
e870: 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d  t && (pPragma->m
e880: 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
e890: 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29  g_ReadOnly)==0 )
e8a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  {.      /* Write
e8b0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
e8c0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
e8d0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
e8e0: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74  t VdbeOpList set
e8f0: 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20  Cookie[] = {.   
e900: 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61       { OP_Transa
e910: 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c  ction,    0,  1,
e920: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f    0},    /* 0 */
e930: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  .        { OP_Se
e940: 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c  tCookie,      0,
e950: 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    0,  0},    /* 
e960: 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20  1 */.      };.  
e970: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
e980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e990: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
e9a0: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
e9b0: 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29  ySize(setCookie)
e9c0: 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73  );.      aOp = s
e9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
e9e0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
e9f0: 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74  (setCookie), set
ea00: 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  Cookie, 0);.    
ea10: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
ea20: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
ea30: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
ea40: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
ea50: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
ea60: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
ea70: 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43    aOp[1].p2 = iC
ea80: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70  ookie;.      aOp
ea90: 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33  [1].p3 = sqlite3
eaa0: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
eab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
eac0: 2a 20 52 65 61 64 20 74 68 65 20 73 70 65 63 69  * Read the speci
ead0: 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75  fied cookie valu
eae0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  e */.      stati
eaf0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
eb00: 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20  st readCookie[] 
eb10: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
eb20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
eb30: 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20    0,  0,  0},   
eb40: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
eb50: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
eb60: 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30  ,      0,  1,  0
eb70: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
eb80: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c        { OP_Resul
eb90: 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20  tRow,       1,  
eba0: 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a  1,  0}.      };.
ebb0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
ebc0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
ebd0: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
ebe0: 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72  ocRequired(v, Ar
ebf0: 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b  raySize(readCook
ec00: 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ie));.      aOp 
ec10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ec20: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
ec30: 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c  ize(readCookie),
ec40: 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20  readCookie,0);. 
ec50: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
ec60: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
ec70: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
ec80: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
ec90: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
eca0: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
ecb0: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d       aOp[1].p3 =
ecc0: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20   iCookie;.      
ecd0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61  sqlite3VdbeReusa
ece0: 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  ble(v);.    }.  
ecf0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
ed00: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ed10: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f  _SCHEMA_VERSION_
ed20: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e  PRAGMAS */..#ifn
ed30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ed40: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
ed50: 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  AGS.  /*.  **   
ed60: 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f  PRAGMA compile_o
ed70: 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a  ptions.  **.  **
ed80: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
ed90: 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65  s of all compile
eda0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73  -time options us
edb0: 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
edc0: 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f  ,.  ** one optio
edd0: 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a  n per row..  */.
ede0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
edf0: 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20  OMPILE_OPTIONS: 
ee00: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
ee10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ee20: 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73  *zOpt;.    pPars
ee30: 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20  e->nMem = 1;.   
ee40: 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20   while( (zOpt = 
ee50: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
ee60: 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21  ption_get(i++))!
ee70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ee80: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
ee90: 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20  g(v, 1, zOpt);. 
eea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eeb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
eec0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
eed0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
eee0: 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b  VdbeReusable(v);
eef0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
ef00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ef10: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
ef20: 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e  N_DIAGS */..#ifn
ef30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ef40: 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WAL.  /*.  **   
ef50: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
ef60: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d  wal_checkpoint =
ef70: 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65   passive|full|re
ef80: 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20  start|truncate. 
ef90: 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f   **.  ** Checkpo
efa0: 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  int the database
efb0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
efc0: 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50  agTyp_WAL_CHECKP
efd0: 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OINT: {.    int 
efe0: 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69  iBt = (pId2->z?i
eff0: 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db:SQLITE_MAX_AT
f000: 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74  TACHED);.    int
f010: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
f020: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
f030: 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  VE;.    if( zRig
f040: 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
f050: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f060: 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d  Right, "full")==
f070: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
f080: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f090: 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20  KPOINT_FULL;.   
f0a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
f0b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
f0c0: 68 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d  ht, "restart")==
f0d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
f0e0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f0f0: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a  KPOINT_RESTART;.
f100: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f110: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f120: 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65  Right, "truncate
f130: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f140: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
f150: 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
f160: 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
f170: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
f180: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c  Mem = 3;.    sql
f190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f1a0: 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c  , OP_Checkpoint,
f1b0: 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b   iBt, eMode, 1);
f1c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f1d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
f1e0: 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20  ultRow, 1, 3);. 
f1f0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f   }.  break;..  /
f200: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f210: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
f220: 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  nt.  **   PRAGMA
f230: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
f240: 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  int = N.  **.  *
f250: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61  * Configure a da
f260: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
f270: 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  n to automatical
f280: 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20  ly checkpoint a 
f290: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66  database.  ** af
f2a0: 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  ter accumulating
f2b0: 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65   N frames in the
f2c0: 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66   log. Or query f
f2d0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  or the current v
f2e0: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a  alue.  ** of N..
f2f0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
f300: 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  Typ_WAL_AUTOCHEC
f310: 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66  KPOINT: {.    if
f320: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
f330: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
f340: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
f350: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
f360: 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ght));.    }.   
f370: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
f380: 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e  (v, .       db->
f390: 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71  xWalCallback==sq
f3a0: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
f3b0: 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ook ? .         
f3c0: 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f    SQLITE_PTR_TO_
f3d0: 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29  INT(db->pWalArg)
f3e0: 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65   : 0);.  }.  bre
f3f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ak;.#endif..  /*
f400: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68  .  **  PRAGMA sh
f410: 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a  rink_memory.  **
f420: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
f430: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35  TION-OF: R-23445
f440: 2d 34 36 31 30 39 20 54 68 69 73 20 70 72 61 67  -46109 This prag
f450: 6d 61 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ma causes the da
f460: 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e  tabase.  ** conn
f470: 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20  ection on which 
f480: 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  it is invoked to
f490: 20 66 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   free up as much
f4a0: 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20   memory as it.  
f4b0: 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69  ** can, by calli
f4c0: 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  ng sqlite3_db_re
f4d0: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a  lease_memory()..
f4e0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
f4f0: 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52  Typ_SHRINK_MEMOR
f500: 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  Y: {.    sqlite3
f510: 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
f520: 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61  ry(db);.    brea
f530: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f540: 2a 20 20 50 52 41 47 4d 41 20 61 6e 61 6c 79 7a  *  PRAGMA analyz
f550: 65 5f 61 73 5f 6e 65 65 64 65 64 0a 20 20 2a 2a  e_as_needed.  **
f560: 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e    PRAGMA schema.
f570: 61 6e 61 6c 79 7a 65 5f 61 73 5f 6e 65 65 64 65  analyze_as_neede
f580: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  d.  **.  ** This
f590: 20 70 72 61 67 6d 61 20 72 75 6e 73 20 41 4e 41   pragma runs ANA
f5a0: 4c 59 5a 45 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LYZE on any tabl
f5b0: 65 73 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  es which would h
f5c0: 61 76 65 20 62 65 6e 65 66 69 74 74 65 64 0a 20  ave benefitted. 
f5d0: 20 2a 2a 20 66 72 6f 6d 20 68 61 76 69 6e 67 20   ** from having 
f5e0: 72 65 63 65 6e 74 20 73 74 61 74 69 73 74 69 63  recent statistic
f5f0: 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
f600: 73 69 6e 63 65 20 74 68 65 20 73 74 61 72 74 20  since the start 
f610: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  of the.  ** curr
f620: 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ent connection. 
f630: 20 4f 6e 6c 79 20 74 61 62 6c 65 73 20 69 6e 20   Only tables in 
f640: 22 73 63 68 65 6d 61 22 20 61 72 65 20 61 6e 61  "schema" are ana
f650: 6c 79 7a 65 64 20 69 6e 20 74 68 65 20 0a 20 20  lyzed in the .  
f660: 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d 2e 20  ** second form. 
f670: 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 66 6f   In the first fo
f680: 72 6d 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 65  rm, all tables e
f690: 78 63 65 70 74 20 54 45 4d 50 20 74 61 62 6c 65  xcept TEMP table
f6a0: 73 20 61 72 65 0a 20 20 2a 2a 20 63 68 65 63 6b  s are.  ** check
f6b0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
f6c0: 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65  table is analyze
f6d0: 64 20 6f 6e 6c 79 20 69 66 20 62 6f 74 68 20 6f  d only if both o
f6e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f6f0: 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20  are true:.  **. 
f700: 20 2a 2a 20 28 31 29 20 54 68 65 20 71 75 65 72   ** (1) The quer
f710: 79 20 70 6c 61 6e 6e 65 72 20 75 73 65 64 20 73  y planner used s
f720: 71 6c 69 74 65 5f 73 74 61 74 31 2d 73 74 79 6c  qlite_stat1-styl
f730: 65 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  e statistics for
f740: 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20   one or.  **    
f750: 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66   more indexes of
f760: 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 73 6f   the table at so
f770: 6d 65 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20  me point during 
f780: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
f790: 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72    **     the cur
f7a0: 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  rent connection.
f7b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29 20 4f  .  **.  ** (2) O
f7c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78  ne or more index
f7d0: 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
f7e0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  are currently un
f7f0: 61 6e 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a  analyzed OR.  **
f800: 20 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20       the number 
f810: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
f820: 61 62 6c 65 20 68 61 73 20 69 6e 63 72 65 61 73  able has increas
f830: 65 64 20 62 79 20 32 35 20 74 69 6d 65 73 20 6f  ed by 25 times o
f840: 72 20 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20  r more.  **     
f850: 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74  since the last t
f860: 69 6d 65 20 41 4e 41 4c 59 5a 45 20 77 61 73 20  ime ANALYZE was 
f870: 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  run..  */.  case
f880: 20 50 72 61 67 54 79 70 5f 41 4e 41 4c 59 5a 45   PragTyp_ANALYZE
f890: 5f 41 53 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20  _AS_NEEDED: {.  
f8a0: 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20    int iDbLast;  
f8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
f8c0: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69   termination poi
f8d0: 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d  nt for the schem
f8e0: 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  a loop */.    in
f8f0: 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20  t iTabCur;      
f900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
f910: 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65  or a table whose
f920: 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63   size needs chec
f930: 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68  king */.    Hash
f940: 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
f950: 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20     /* Loop over 
f960: 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65  tables of a sche
f970: 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61  ma */.    Schema
f980: 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20   *pSchema;      
f990: 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
f9a0: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61  schema */.    Ta
f9b0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
f9c0: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
f9d0: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  in the schema */
f9e0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
f9f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
fa00: 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  n index of the t
fa10: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45  able */.    LogE
fa20: 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20  st szThreshold; 
fa30: 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73     /* Size thres
fa40: 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68  hold above which
fa50: 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e   reanalysis is n
fa60: 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72  eedd */.    char
fa70: 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20   *zSubSql;      
fa80: 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
fa90: 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53  ent for the OP_S
faa0: 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f  qlExec opcode */
fab0: 0a 0a 20 20 20 20 69 54 61 62 43 75 72 20 3d 20  ..    iTabCur = 
fac0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
fad0: 20 20 20 20 66 6f 72 28 69 44 62 4c 61 73 74 20      for(iDbLast 
fae0: 3d 20 7a 44 62 3f 69 44 62 3a 64 62 2d 3e 6e 44  = zDb?iDb:db->nD
faf0: 62 2d 31 3b 20 69 44 62 3c 3d 69 44 62 4c 61 73  b-1; iDb<=iDbLas
fb00: 74 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  t; iDb++){.     
fb10: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f   if( iDb==1 ) co
fb20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71  ntinue;.      sq
fb30: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
fb40: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
fb50: 62 29 3b 0a 20 20 20 20 20 20 70 53 63 68 65 6d  b);.      pSchem
fb60: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
fb70: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
fb80: 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
fb90: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
fba0: 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73  tblHash); k; k=s
fbb0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
fbc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
fbd0: 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
fbe0: 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 0a 20 20  HashData(k);..  
fbf0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 61 62 6c        /* If tabl
fc00: 65 20 70 54 61 62 20 68 61 73 20 6e 6f 74 20 62  e pTab has not b
fc10: 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 77 61  een used in a wa
fc20: 79 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 6e  y that would ben
fc30: 65 66 69 74 20 66 72 6f 6d 0a 20 20 20 20 20 20  efit from.      
fc40: 20 20 2a 2a 20 68 61 76 69 6e 67 20 61 6e 61 6c    ** having anal
fc50: 79 73 69 73 20 73 74 61 74 69 73 74 69 63 73 20  ysis statistics 
fc60: 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
fc70: 6e 74 20 73 65 73 73 69 6f 6e 2c 20 74 68 65 6e  nt session, then
fc80: 20 73 6b 69 70 20 69 74 2e 0a 20 20 20 20 20 20   skip it..      
fc90: 20 20 2a 2a 20 54 68 69 73 20 61 6c 73 6f 20 68    ** This also h
fca0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
fcb0: 20 73 6b 69 70 70 69 6e 67 20 76 69 72 74 75 61   skipping virtua
fcc0: 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 76 69 65  l tables and vie
fcd0: 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ws */.        if
fce0: 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
fcf0: 73 20 26 20 54 46 5f 53 74 61 74 73 55 73 65 64  s & TF_StatsUsed
fd00: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
fd10: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61  ..        /* Rea
fd20: 6e 61 6c 79 7a 65 20 69 66 20 74 68 65 20 74 61  nalyze if the ta
fd30: 62 6c 65 20 69 73 20 32 35 20 74 69 6d 65 73 20  ble is 25 times 
fd40: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
fd50: 6c 61 73 74 20 61 6e 61 6c 79 73 69 73 20 2a 2f  last analysis */
fd60: 0a 20 20 20 20 20 20 20 20 73 7a 54 68 72 65 73  .        szThres
fd70: 68 6f 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  hold = pTab->nRo
fd80: 77 4c 6f 67 45 73 74 20 2b 20 34 36 3b 20 61 73  wLogEst + 46; as
fd90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 67  sert( sqlite3Log
fda0: 45 73 74 28 32 35 29 3d 3d 34 36 20 29 3b 0a 20  Est(25)==46 );. 
fdb0: 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
fdc0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
fdd0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
fde0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
fdf0: 20 69 66 28 20 21 70 49 64 78 2d 3e 68 61 73 53   if( !pIdx->hasS
fe00: 74 61 74 31 20 29 7b 0a 20 20 20 20 20 20 20 20  tat1 ){.        
fe10: 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20      szThreshold 
fe20: 3d 20 30 3b 20 2f 2a 20 41 6c 77 61 79 73 20 61  = 0; /* Always a
fe30: 6e 61 6c 79 7a 65 20 69 66 20 61 6e 79 20 69 6e  nalyze if any in
fe40: 64 65 78 20 6c 61 63 6b 73 20 73 74 61 74 69 73  dex lacks statis
fe50: 74 69 63 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  tics */.        
fe60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fe70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
fe80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 54  .        if( szT
fe90: 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20  hreshold ){.    
fea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
feb0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
fec0: 54 61 62 43 75 72 2c 20 69 44 62 2c 20 70 54 61  TabCur, iDb, pTa
fed0: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
fee0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fef0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ff00: 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 2c 20 69 54  OP_IfSmaller, iT
ff10: 61 62 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20  abCur, .        
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ff40: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
ff50: 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20   szThreshold);. 
ff60: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
ff70: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ff80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62    }.        zSub
ff90: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
ffa0: 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a  intf(db, "ANALYZ
ffb0: 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22  E \"%w\".\"%w\""
ffc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
fff0: 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  zDbSName, pTab->
10000 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
10010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10020 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c  4(v, OP_SqlExec,
10030 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71   0, 0, 0, zSubSq
10040 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  l, P4_DYNAMIC);.
10050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10060 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10070 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
10080 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20   busy_timeout.  
10090 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79  **   PRAGMA busy
100a0 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a  _timeout = N.  *
100b0 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  *.  ** Call sqli
100c0 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
100d0 28 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e  (db, N).  Return
100e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
100f0 65 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20  eout value.  ** 
10100 69 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20  if one is set.  
10110 49 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c  If no busy handl
10120 65 72 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e  er or a differen
10130 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69  t busy handler i
10140 73 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20  s set.  ** then 
10150 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  0 is returned.  
10160 53 65 74 74 69 6e 67 20 74 68 65 20 62 75 73 79  Setting the busy
10170 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72  _timeout to 0 or
10180 20 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64   negative.  ** d
10190 69 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65  isables the time
101a0 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61  out..  */.  /*ca
101b0 73 65 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f  se PragTyp_BUSY_
101c0 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c  TIMEOUT*/ defaul
101d0 74 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t: {.    assert(
101e0 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54   pPragma->ePragT
101f0 79 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59  yp==PragTyp_BUSY
10200 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20  _TIMEOUT );.    
10210 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
10220 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
10230 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c  _timeout(db, sql
10240 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
10250 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
10260 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
10270 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29  db->busyTimeout)
10280 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
10290 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
102a0 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c  AGMA soft_heap_l
102b0 69 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47  imit.  **   PRAG
102c0 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  MA soft_heap_lim
102d0 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  it = N.  **.  **
102e0 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
102f0 4f 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33  OF: R-26343-4593
10300 30 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e  0 This pragma in
10310 76 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  vokes the.  ** s
10320 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
10330 5f 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72  _limit64() inter
10340 66 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72  face with the ar
10350 67 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69  gument N, if N i
10360 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  s.  ** specified
10370 20 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65   and is a non-ne
10380 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a  gative integer..
10390 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
103a0 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d  ION-OF: R-64451-
103b0 30 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68  07163 The soft_h
103c0 65 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61  eap_limit pragma
103d0 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74   always.  ** ret
103e0 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e  urns the same in
103f0 74 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64  teger that would
10400 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
10410 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
10420 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
10430 36 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67  64(-1) C-languag
10440 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
10450 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
10460 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a  SOFT_HEAP_LIMIT:
10470 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69   {.    sqlite3_i
10480 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20  nt64 N;.    if( 
10490 7a 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65  zRight && sqlite
104a0 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
104b0 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49  Right, &N)==SQLI
104c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
104d0 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
104e0 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20  _limit64(N);.   
104f0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
10500 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
10510 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
10520 74 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72  t64(-1));.    br
10530 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
10540 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72   **   PRAGMA thr
10550 65 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47  eads.  **   PRAG
10560 4d 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20  MA threads = N. 
10570 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75   **.  ** Configu
10580 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  re the maximum n
10590 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20  umber of worker 
105a0 74 68 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e  threads.  Return
105b0 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61   the new.  ** ma
105c0 78 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67  ximum, which mig
105d0 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
105e0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
105f0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54    case PragTyp_T
10600 48 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71  HREADS: {.    sq
10610 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20  lite3_int64 N;. 
10620 20 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20     if( zRight.  
10630 20 20 20 26 26 20 73 71 6c 69 74 65 33 44 65 63     && sqlite3Dec
10640 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68  OrHexToI64(zRigh
10650 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f  t, &N)==SQLITE_O
10660 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20  K.     && N>=0. 
10670 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
10680 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51  te3_limit(db, SQ
10690 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
106a0 52 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29  R_THREADS, (int)
106b0 28 4e 26 30 78 37 66 66 66 66 66 66 66 29 29 3b  (N&0x7fffffff));
106c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
106d0 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71  nSingleInt(v, sq
106e0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
106f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
10700 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29  KER_THREADS, -1)
10710 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
10720 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
10730 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
10740 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
10750 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52  EST).  /*.  ** R
10760 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
10770 74 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20  t state of file 
10780 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  logs for all dat
10790 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61  abases.  */.  ca
107a0 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f  se PragTyp_LOCK_
107b0 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74  STATUS: {.    st
107c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
107d0 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d  *const azLockNam
107e0 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75  e[] = {.      "u
107f0 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65  nlocked", "share
10800 64 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20  d", "reserved", 
10810 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c  "pending", "excl
10820 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20  usive".    };.  
10830 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61    int i;.    pPa
10840 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
10850 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
10860 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10870 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20     Btree *pBt;. 
10880 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10890 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f  *zState = "unkno
108a0 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  wn";.      int j
108b0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
108c0 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d  aDb[i].zDbSName=
108d0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
108e0 20 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61       pBt = db->a
108f0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
10900 20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73   if( pBt==0 || s
10910 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
10920 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
10930 20 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c      zState = "cl
10940 6f 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  osed";.      }el
10950 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66  se if( sqlite3_f
10960 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
10970 69 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  i ? db->aDb[i].z
10980 44 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20  DbSName : 0, .  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f     SQLITE_FCNTL_
109c0 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d  LOCKSTATE, &j)==
109d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
109e0 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61        zState = a
109f0 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20  zLockName[j];.  
10a00 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
10a10 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
10a20 28 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d  (v, 1, "ss", db-
10a30 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
10a40 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20  , zState);.     
10a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a60 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
10a70 6f 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d  ow, 1, 2);.    }
10a80 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10a90 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
10aa0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
10ab0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b    case PragTyp_K
10ac0 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  EY: {.    if( zR
10ad0 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b  ight ) sqlite3_k
10ae0 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
10af0 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74  Right, sqlite3St
10b00 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b  rlen30(zRight));
10b10 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10b20 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 52    case PragTyp_R
10b30 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  EKEY: {.    if( 
10b40 7a 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33  zRight ) sqlite3
10b50 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  _rekey_v2(db, zD
10b60 62 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74  b, zRight, sqlit
10b70 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68  e3Strlen30(zRigh
10b80 74 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  t));.    break;.
10b90 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54    }.  case PragT
10ba0 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20  yp_HEXKEY: {.   
10bb0 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
10bc0 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
10bd0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
10be0 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
10bf0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
10c00 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
10c10 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
10c20 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69  ite3Isxdigit(zRi
10c30 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ght[i]); i++){. 
10c40 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
10c50 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
10c60 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67  te3HexToInt(zRig
10c70 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ht[i]);.        
10c80 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a  if( (i&1)!=0 ) z
10c90 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65  Key[i/2] = iByte
10ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10cb0 69 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20  if( (zLeft[3] & 
10cc0 30 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20  0xf)==0xb ){.   
10cd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79       sqlite3_key
10ce0 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65  _v2(db, zDb, zKe
10cf0 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d  y, i/2);.      }
10d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
10d10 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64  lite3_rekey_v2(d
10d20 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f  b, zDb, zKey, i/
10d30 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
10d40 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
10d50 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
10d60 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
10d70 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64  ODEC) || defined
10d80 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
10d90 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61  EROD).  case Pra
10da0 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58  gTyp_ACTIVATE_EX
10db0 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52  TENSIONS: if( zR
10dc0 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53  ight ){.#ifdef S
10dd0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
10de0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
10df0 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
10e00 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b  "see-", 4)==0 ){
10e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61  .      sqlite3_a
10e20 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69  ctivate_see(&zRi
10e30 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23  ght[4]);.    }.#
10e40 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10e50 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44  ITE_ENABLE_CEROD
10e60 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10e70 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
10e80 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30   "cerod-", 6)==0
10e90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10ea0 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64  3_activate_cerod
10eb0 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20  (&zRight[6]);.  
10ec0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
10ed0 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
10ee0 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
10ef0 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20  e PRAGMA switch 
10f00 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
10f10 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73 20  lowing block is 
10f20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
10f30 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
10f40 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79  efined. Its only
10f50 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69 73  .  ** purpose is
10f60 20 74 6f 20 65 78 65 63 75 74 65 20 61 73 73 65   to execute asse
10f70 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
10f80 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 69  to verify that i
10f90 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67 46  f the.  ** PragF
10fa0 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c  lg_NoColumns1 fl
10fb0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
10fc0 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  e caller specifi
10fd0 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20  ed an argument. 
10fe0 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47 4d   ** to the PRAGM
10ff0 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  A, the implement
11000 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61 64  ation has not ad
11010 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c  ded any OP_Resul
11020 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74 72  tRow .  ** instr
11030 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 56  uctions to the V
11040 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  M.  */.  if( (pP
11050 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
11060 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  & PragFlg_NoColu
11070 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74 20  mns1) && zRight 
11080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11090 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
110a0 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72 61  Row(v);.  }..pra
110b0 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  gma_out:.  sqlit
110c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65  e3DbFree(db, zLe
110d0 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ft);.  sqlite3Db
110e0 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29  Free(db, zRight)
110f0 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
11100 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11110 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ABLE./**********
11120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11160 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ***.** Implement
11170 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f 6e  ation of an epon
11180 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
11190 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61 20  ble that runs a 
111a0 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79  pragma..**.*/.ty
111b0 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
111c0 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56 74  gmaVtab PragmaVt
111d0 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ab;.typedef stru
111e0 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  ct PragmaVtabCur
111f0 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43 75  sor PragmaVtabCu
11200 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72 61  rsor;.struct Pra
11210 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c 69  gmaVtab {.  sqli
11220 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20  te3_vtab base;  
11230 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c        /* Base cl
11240 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69  ass.  Must be fi
11250 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rst */.  sqlite3
11260 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
11270 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
11280 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
11290 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e 67   which it belong
112a0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72 61  s */.  const Pra
112b0 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 20  gmaName *pName; 
112c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
112d0 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20 6e  pragma */.  u8 n
112e0 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20  Hidden;         
112f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11300 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  of hidden column
11310 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64 65  s */.  u8 iHidde
11320 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11330 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
11340 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 63 6f   first hidden co
11350 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  lumn */.};.struc
11360 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  t PragmaVtabCurs
11370 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  or {.  sqlite3_v
11380 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
11390 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20   /* Base class. 
113a0 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
113b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
113c0 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f 2a   *pPragma;    /*
113d0 20 54 68 65 20 70 72 61 67 6d 61 20 73 74 61 74   The pragma stat
113e0 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a  ement to run */.
113f0 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
11400 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43  Rowid;      /* C
11410 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
11420 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32 5d    char *azArg[2]
11430 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
11440 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67 75  alue of the argu
11450 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61 20  ment and schema 
11460 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  */.};../* .** Pr
11470 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
11480 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65  le module xConne
11490 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ct method..*/.st
114a0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
114b0 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  tabConnect(.  sq
114c0 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
114d0 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
114e0 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
114f0 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
11500 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
11510 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
11520 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  zErr.){.  const 
11530 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61  PragmaName *pPra
11540 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72 61  gma = (const Pra
11550 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a 20  gmaName*)pAux;. 
11560 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
11570 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  b = 0;.  int rc;
11580 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
11590 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
115a0 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a    StrAccum acc;.
115b0 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
115c0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
115d0 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55  METER(argc);.  U
115e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
115f0 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  argv);.  sqlite3
11600 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63  StrAccumInit(&ac
11610 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a 65  c, 0, zBuf, size
11620 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20  of(zBuf), 0);.  
11630 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
11640 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22  ppendAll(&acc, "
11650 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 29  CREATE TABLE x")
11660 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70  ;.  for(i=0, j=p
11670 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61  Pragma->iPragCNa
11680 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e  me; i<pPragma->n
11690 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20  PragCName; i++, 
116a0 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  j++){.    sqlite
116b0 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22  3XPrintf(&acc, "
116c0 25 63 5c 22 25 73 5c 22 22 2c 20 63 53 65 70 2c  %c\"%s\"", cSep,
116d0 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a   pragCName[j]);.
116e0 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a      cSep = ',';.
116f0 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29    }.  if( i==0 )
11700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
11710 69 6e 74 66 28 26 61 63 63 2c 20 22 28 5c 22 25  intf(&acc, "(\"%
11720 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a  s\"", pPragma->z
11730 4e 61 6d 65 29 3b 0a 20 20 20 20 63 53 65 70 20  Name);.    cSep 
11740 3d 20 27 2c 27 3b 0a 20 20 20 20 69 2b 2b 3b 0a  = ',';.    i++;.
11750 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69    }.  j = 0;.  i
11760 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  f( pPragma->mPra
11770 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
11780 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73 71  esult1 ){.    sq
11790 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
117a0 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c 61  endAll(&acc, ",a
117b0 72 67 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20  rg HIDDEN");.   
117c0 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   j++;.  }.  if( 
117d0 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
117e0 67 20 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68  g & (PragFlg_Sch
117f0 65 6d 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53  emaOpt|PragFlg_S
11800 63 68 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20  chemaReq) ){.   
11810 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
11820 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20  AppendAll(&acc, 
11830 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45 4e 22  ",schema HIDDEN"
11840 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
11850 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
11860 6d 41 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29  mAppend(&acc, ")
11870 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 1);.  sqlite3
11880 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
11890 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20  acc);.  assert( 
118a0 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73  strlen(zBuf) < s
118b0 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b  izeof(zBuf)-1 );
118c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
118d0 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c  declare_vtab(db,
118e0 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63   zBuf);.  if( rc
118f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11900 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d     pTab = (Pragm
11910 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d  aVtab*)sqlite3_m
11920 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61  alloc(sizeof(Pra
11930 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69  gmaVtab));.    i
11940 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
11950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11960 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
11970 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
11980 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Tab, 0, sizeof(P
11990 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
119a0 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d     pTab->pName =
119b0 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20   pPragma;.      
119c0 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pTab->db = db;. 
119d0 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64       pTab->iHidd
119e0 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54  en = i;.      pT
119f0 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b  ab->nHidden = j;
11a00 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
11a10 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
11a20 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
11a30 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
11a40 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a  g(db));.  }..  *
11a50 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
11a60 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20  3_vtab*)pTab;.  
11a70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11a80 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
11a90 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
11aa0 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74   xDisconnect met
11ab0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
11ac0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73  nt pragmaVtabDis
11ad0 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
11ae0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
11af0 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
11b00 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
11b10 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
11b20 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72  _free(pTab);.  r
11b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11b40 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75  .}../* Figure ou
11b50 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  t the best index
11b60 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63   to use to searc
11b70 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  h a pragma virtu
11b80 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
11b90 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65  There are not re
11ba0 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63  ally any index c
11bb0 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20  hoices.  But we 
11bc0 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67  want to encourag
11bd0 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70  e the.** query p
11be0 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d  lanner to give =
11bf0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  = constraints on
11c00 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20   as many hidden 
11c10 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a  parameters as.**
11c20 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65   possible, and e
11c30 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65  specially on the
11c40 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61   first hidden pa
11c50 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74  rameter.  So ret
11c60 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f  urn a.** high co
11c70 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72  st if hidden par
11c80 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f  ameters are unco
11c90 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74  nstrained..*/.st
11ca0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
11cb0 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c  tabBestIndex(sql
11cc0 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20  ite3_vtab *tab, 
11cd0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
11ce0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20  fo *pIdxInfo){. 
11cf0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
11d00 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
11d10 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74  )tab;.  const st
11d20 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
11d30 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
11d40 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
11d50 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65  t i, j;.  int se
11d60 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e  en[2];..  pIdxIn
11d70 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
11d80 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
11d90 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64   if( pTab->nHidd
11da0 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20  en==0 ){ return 
11db0 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70  SQLITE_OK; }.  p
11dc0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
11dd0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
11de0 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20  nt;.  seen[0] = 
11df0 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30  0;.  seen[1] = 0
11e00 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
11e10 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
11e20 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73  aint; i++, pCons
11e30 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69  traint++){.    i
11e40 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
11e50 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74  usable==0 ) cont
11e60 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
11e70 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53  onstraint->op!=S
11e80 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
11e90 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74  TRAINT_EQ ) cont
11ea0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
11eb0 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
11ec0 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64  mn < pTab->iHidd
11ed0 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  en ) continue;. 
11ee0 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69     j = pConstrai
11ef0 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54  nt->iColumn - pT
11f00 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20  ab->iHidden;.   
11f10 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29   assert( j < 2 )
11f20 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20  ;.    seen[j] = 
11f30 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  i+1;.  }.  if( s
11f40 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  een[0]==0 ){.   
11f50 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
11f60 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
11f70 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20  le)2147483647;. 
11f80 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
11f90 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34  imatedRows = 214
11fa0 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74  7483647;.    ret
11fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11fc0 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d   }.  j = seen[0]
11fd0 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  -1;.  pIdxInfo->
11fe0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11ff0 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [j].argvIndex = 
12000 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
12010 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
12020 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69  j].omit = 1;.  i
12030 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20  f( seen[1]==0 ) 
12040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12050 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
12060 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
12070 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78  ouble)20;.  pIdx
12080 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
12090 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20  ows = 20;.  j = 
120a0 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64  seen[1]-1;.  pId
120b0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
120c0 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
120d0 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78  ndex = 2;.  pIdx
120e0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
120f0 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
12100 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
12110 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72  ITE_OK;.}../* Cr
12120 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
12130 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61  r for the pragma
12140 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
12150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
12160 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69  gmaVtabOpen(sqli
12170 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
12180 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
12190 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
121a0 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
121b0 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43  rsor *pCsr;.  pC
121c0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
121d0 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f  Cursor*)sqlite3_
121e0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
121f0 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73  Csr));.  if( pCs
12200 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
12210 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
12220 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
12230 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43  zeof(PragmaVtabC
12240 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d  ursor));.  pCsr-
12250 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56  >base.pVtab = pV
12260 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  tab;.  *ppCursor
12270 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a   = &pCsr->base;.
12280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12290 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20  OK;.}../* Clear 
122a0 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  all content from
122b0 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
122c0 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f  table cursor. */
122d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61  .static void pra
122e0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
122f0 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  ar(PragmaVtabCur
12300 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
12310 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  t i;.  sqlite3_f
12320 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
12330 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e  ragma);.  pCsr->
12340 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66  pPragma = 0;.  f
12350 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
12360 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
12370 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12380 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
12390 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43  zArg[i]);.    pC
123a0 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30  sr->azArg[i] = 0
123b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73  ;.  }.}../* Clos
123c0 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  e a pragma virtu
123d0 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  al table cursor 
123e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
123f0 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71  agmaVtabClose(sq
12400 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
12410 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d  r *cur){.  Pragm
12420 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
12430 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
12440 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72  ursor*)cur;.  pr
12450 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
12460 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c  ear(pCsr);.  sql
12470 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b  ite3_free(pCsr);
12480 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12490 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e  _OK;.}../* Advan
124a0 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69  ce the pragma vi
124b0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
124c0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
124d0 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ow */.static int
124e0 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28   pragmaVtabNext(
124f0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
12500 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
12510 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
12520 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
12530 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
12540 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
12550 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12560 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  OK;..  /* Increm
12570 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76  ent the xRowid v
12580 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e  alue */.  pCsr->
12590 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65  iRowid++;.  asse
125a0 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d  rt( pCsr->pPragm
125b0 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  a );.  if( SQLIT
125c0 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73  E_ROW!=sqlite3_s
125d0 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  tep(pCsr->pPragm
125e0 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  a) ){.    rc = s
125f0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
12600 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
12610 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d      pCsr->pPragm
12620 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d  a = 0;.    pragm
12630 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
12640 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCsr);.  }.  re
12650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
12660 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
12670 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
12680 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a  Filter method..*
12690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
126a0 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20  gmaVtabFilter(. 
126b0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
126c0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
126d0 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
126e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
126f0 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
12700 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
12710 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67  **argv.){.  Prag
12720 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
12730 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
12740 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
12750 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
12760 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
12770 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
12780 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
12790 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
127a0 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  j;.  StrAccum ac
127b0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
127c0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
127d0 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20  ETER(idxNum);.  
127e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
127f0 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67  (idxStr);.  prag
12800 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
12810 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28  r(pCsr);.  j = (
12820 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72  pTab->pName->mPr
12830 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
12840 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20  Result1)!=0 ? 0 
12850 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  : 1;.  for(i=0; 
12860 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b  i<argc; i++, j++
12870 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ){.    assert( j
12880 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d  <ArraySize(pCsr-
12890 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 70  >azArg) );.    p
128a0 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20  Csr->azArg[j] = 
128b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
128c0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
128d0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
128e0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72  ));.    if( pCsr
128f0 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b  ->azArg[j]==0 ){
12900 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12910 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12920 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  }.  }.  sqlite3S
12930 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63  trAccumInit(&acc
12940 2c 20 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  , 0, 0, 0, pTab-
12950 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
12960 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
12970 47 54 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  GTH]);.  sqlite3
12980 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
12990 6c 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41 20  l(&acc, "PRAGMA 
129a0 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  ");.  if( pCsr->
129b0 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20  azArg[1] ){.    
129c0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
129d0 61 63 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72  acc, "%Q.", pCsr
129e0 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  ->azArg[1]);.  }
129f0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
12a00 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63  umAppendAll(&acc
12a10 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a  , pTab->pName->z
12a20 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 73  Name);.  if( pCs
12a30 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20  r->azArg[0] ){. 
12a40 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
12a50 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70  f(&acc, "=%Q", p
12a60 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a  Csr->azArg[0]);.
12a70 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
12a80 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
12a90 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20  sh(&acc);.  if( 
12aa0 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
12ab0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
12ad0 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64  epare_v2(pTab->d
12ae0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
12af0 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b  sr->pPragma, 0);
12b00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12b10 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  zSql);.  if( rc!
12b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12b30 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
12b40 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
12b50 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12b60 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62  ite3_errmsg(pTab
12b70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75  ->db));.    retu
12b80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
12b90 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65  urn pragmaVtabNe
12ba0 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  xt(pVtabCursor);
12bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61  .}../*.** Pragma
12bc0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
12bd0 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f  odule xEof metho
12be0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12bf0 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73   pragmaVtabEof(s
12c00 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
12c10 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
12c20 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
12c30 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
12c40 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
12c50 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72  pVtabCursor;.  r
12c60 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72  eturn (pCsr->pPr
12c70 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20  agma==0);.}../* 
12c80 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  The xColumn meth
12c90 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  od simply return
12ca0 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
12cb0 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  ing column from.
12cc0 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20  ** the PRAGMA.  
12cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12ce0 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28  ragmaVtabColumn(
12cf0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
12d00 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
12d10 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  sor, .  sqlite3_
12d20 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
12d30 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67   int i.){.  Prag
12d40 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
12d50 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
12d60 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
12d70 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
12d80 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
12d90 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
12da0 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
12db0 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64  f( i<pTab->iHidd
12dc0 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
12dd0 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
12de0 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
12df0 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70  mn_value(pCsr->p
12e00 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d  Pragma, i));.  }
12e10 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
12e20 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
12e30 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69  x, pCsr->azArg[i
12e40 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c  -pTab->iHidden],
12e50 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
12e60 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ENT);.  }.  retu
12e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12e80 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
12e90 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
12ea0 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f  ule xRowid metho
12eb0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12ec0 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64   pragmaVtabRowid
12ed0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
12ee0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
12ef0 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
12f00 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  *p){.  PragmaVta
12f10 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
12f20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
12f30 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
12f40 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f    *p = pCsr->iRo
12f50 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
12f60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
12f70 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  he pragma virtua
12f80 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a  l table object *
12f90 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
12fa0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72  qlite3_module pr
12fb0 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d  agmaVtabModule =
12fc0 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
12ff0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65  /* xCreate - cre
13020 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  ate a table */. 
13030 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65   pragmaVtabConne
13040 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
13050 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e   xConnect - conn
13060 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69  ect to an existi
13070 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72  ng table */.  pr
13080 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65  agmaVtabBestInde
13090 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42  x,         /* xB
130a0 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72  estIndex - Deter
130b0 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61  mine search stra
130c0 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61  tegy */.  pragma
130d0 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20  VtabDisconnect, 
130e0 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f         /* xDisco
130f0 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65  nnect - Disconne
13100 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  ct from a table 
13110 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20    /* xDestroy - 
13140 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a  Drop a table */.
13150 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e    pragmaVtabOpen
13160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13170 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
13180 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61   cursor */.  pra
13190 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20  gmaVtabClose,   
131a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
131b0 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
131c0 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
131d0 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20  VtabFilter,     
131e0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
131f0 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
13200 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
13210 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65  /.  pragmaVtabNe
13220 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
13230 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
13240 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
13250 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c    pragmaVtabEof,
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13270 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67  * xEof */.  prag
13280 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20  maVtabColumn,   
13290 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
132a0 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
132b0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52  */.  pragmaVtabR
132c0 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
132d0 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
132e0 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  ad data */.  0, 
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
13310 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74  date - write dat
13320 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20      /* xBegin - 
13350 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
13360 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73      /* xSync - s
13390 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ync transaction 
133a0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63    /* xCommit - c
133d0 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
133e0 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
13410 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   - rollback tran
13420 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
13450 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e  ndFunction - fun
13460 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
13470 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  g */.  0,       
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d      /* xRename -
134a0 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c   rename the tabl
134b0 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
134e0 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
13510 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13530 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
13540 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
13550 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54  eck to see if zT
13560 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79  abName is really
13570 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70   the name of a p
13580 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73  ragma.  If it is
13590 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74  ,.** then regist
135a0 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  er an eponymous 
135b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f  virtual table fo
135c0 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e  r that pragma an
135d0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
135e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64  inter to the Mod
135f0 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ule object for t
13600 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  he new virtual t
13610 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20  able..*/.Module 
13620 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74  *sqlite3PragmaVt
13630 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  abRegister(sqlit
13640 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
13650 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f  ar *zName){.  co
13660 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
13670 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  pName;.  assert(
13680 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
13690 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
136a0 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  _", 7)==0 );.  p
136b0 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63  Name = pragmaLoc
136c0 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20  ate(zName+7);.  
136d0 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72  if( pName==0 ) r
136e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
136f0 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20  pName->mPragFlg 
13700 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  & (PragFlg_Resul
13710 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  t0|PragFlg_Resul
13720 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  t1))==0 ) return
13730 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
13740 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
13750 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
13760 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  e)==0 );.  retur
13770 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72 65  n sqlite3VtabCre
13780 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e  ateModule(db, zN
13790 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62  ame, &pragmaVtab
137a0 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70  Module, (void*)p
137b0 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e  Name, 0);.}..#en
137c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
137d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
137e0 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
137f0 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
13800 20 2a 2f 0a                                       */.