/ Hex Artifact Content
Login

Artifact 850bee0057697e817c337c8141e12f74c64eb8f4:


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 2c 20   upr, lwr, mid, 
2260: 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20  rc;.  lwr = 0;. 
2270: 20 75 70 72 20 3d 20 41 72 72 61 79 53 69 7a 65   upr = ArraySize
2280: 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 2d 31 3b  (aPragmaName)-1;
2290: 0a 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75  .  while( lwr<=u
22a0: 70 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20  pr ){.    mid = 
22b0: 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20  (lwr+upr)/2;.   
22c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
22d0: 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 50 72  ricmp(zName, aPr
22e0: 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d 2e 7a 4e  agmaName[mid].zN
22f0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
2300: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2310: 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
2320: 20 20 20 75 70 72 20 3d 20 6d 69 64 20 2d 20 31     upr = mid - 1
2330: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2340: 20 20 20 6c 77 72 20 3d 20 6d 69 64 20 2b 20 31     lwr = mid + 1
2350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2360: 74 75 72 6e 20 6c 77 72 3e 75 70 72 20 3f 20 30  turn lwr>upr ? 0
2370: 20 3a 20 26 61 50 72 61 67 6d 61 4e 61 6d 65 5b   : &aPragmaName[
2380: 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  mid];.}../*.** P
2390: 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20  rocess a pragma 
23a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
23b0: 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f  ** Pragmas are o
23c0: 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a  f this form:.**.
23d0: 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 5b  **      PRAGMA [
23e0: 73 63 68 65 6d 61 2e 5d 69 64 20 5b 3d 20 76 61  schema.]id [= va
23f0: 6c 75 65 2d 6c 69 73 74 5d 0a 2a 2a 0a 2a 2a 20  lue-list].**.** 
2400: 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  If the left side
2410: 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69 64   is "database.id
2420: 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20 74  " then pId1 is t
2430: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
2440: 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20  .** and pId2 is 
2450: 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65 20  the id.  If the 
2460: 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75 73  left side is jus
2470: 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64 31  t "id" then pId1
2480: 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e   is the.** id an
2490: 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d  d pId2 is any em
24a0: 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76  pty string..*/.v
24b0: 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d  oid sqlite3Pragm
24c0: 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  a(.  Parse *pPar
24d0: 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49  se, .  Token *pI
24e0: 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d1,        /* Fi
24f0: 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68  rst part of [sch
2500: 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f  ema.]id field */
2510: 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20  .  Token *pId2, 
2520: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
2530: 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61   part of [schema
2540: 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e  .]id field, or N
2550: 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  ULL */.  IdList 
2560: 2a 70 56 61 6c 75 65 73 20 20 20 20 20 2f 2a 20  *pValues     /* 
2570: 54 68 65 20 76 61 6c 75 65 2d 6c 69 73 74 20 61  The value-list a
2580: 72 67 75 6d 65 6e 74 73 2e 20 20 4e 55 4c 4c 20  rguments.  NULL 
2590: 69 66 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 29 7b  if omitted */.){
25a0: 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d  .  char *zLeft =
25b0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c   0;       /* Nul
25c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d  -terminated UTF-
25d0: 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f  8 string <id> */
25e0: 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20  .  char *zRight 
25f0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c  = 0;      /* Nul
2600: 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d  -terminated UTF-
2610: 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e  8 string <value>
2620: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
2630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
2640: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74   0;   /* The dat
2650: 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
2660: 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20  Token *pId;     
2670: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2680: 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20  r to <id> token 
2690: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74  */.  char *aFcnt
26a0: 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41  l[4];       /* A
26b0: 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54  rgument to SQLIT
26c0: 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a  E_FCNTL_PRAGMA *
26d0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
26e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
26f0: 74 61 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72  tabase index for
2700: 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20   <database> */. 
2710: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2730: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f   return value fo
2740: 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  rm SQLITE_FCNTL_
2750: 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69  PRAGMA */.  sqli
2760: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2770: 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20  ->db;    /* The 
2780: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2790: 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  ion */.  Db *pDb
27a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
27c0: 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 62  cific database b
27d0: 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f  eing pragmaed */
27e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
27f0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
2800: 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65  se);  /* Prepare
2810: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
2820: 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
2830: 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a  e *pPragma;   /*
2840: 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a   The pragma */..
2850: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
2860: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2870: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
2880: 6c 79 4f 6e 63 65 28 76 29 3b 0a 20 20 70 50 61  lyOnce(v);.  pPa
2890: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 0a  rse->nMem = 2;..
28a0: 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 20 74    /* Interpret t
28b0: 68 65 20 5b 73 63 68 65 6d 61 2e 5d 20 70 61 72  he [schema.] par
28c0: 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20  t of the pragma 
28d0: 73 74 61 74 65 6d 65 6e 74 2e 20 69 44 62 20 69  statement. iDb i
28e0: 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  s the.  ** index
28f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2900: 20 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20   this pragma is 
2910: 62 65 69 6e 67 20 61 70 70 6c 69 65 64 20 74 6f  being applied to
2920: 20 69 6e 20 64 62 2e 61 44 62 5b 5d 2e 20 2a 2f   in db.aDb[]. */
2930: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
2940: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
2950: 73 65 2c 20 70 49 64 31 2c 20 70 49 64 32 2c 20  se, pId1, pId2, 
2960: 26 70 49 64 29 3b 0a 20 20 69 66 28 20 69 44 62  &pId);.  if( iDb
2970: 3c 30 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  <0 ) goto pragma
2980: 5f 6f 75 74 3b 0a 20 20 70 44 62 20 3d 20 26 64  _out;.  pDb = &d
2990: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
29a0: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
29b0: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
29c0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
29d0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
29e0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
29f0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2a00: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2a10: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2a20: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2a30: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2a40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2a50: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2a60: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2a70: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2a80: 4c 65 66 74 20 29 20 67 6f 74 6f 20 70 72 61 67  Left ) goto prag
2a90: 6d 61 5f 6f 75 74 3b 0a 20 20 69 66 28 20 70 56  ma_out;.  if( pV
2aa0: 61 6c 75 65 73 20 29 20 7a 52 69 67 68 74 20 3d  alues ) zRight =
2ab0: 20 70 56 61 6c 75 65 73 2d 3e 61 5b 30 5d 2e 7a   pValues->a[0].z
2ac0: 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Name;..  assert(
2ad0: 20 70 49 64 32 20 29 3b 0a 20 20 7a 44 62 20 3d   pId2 );.  zDb =
2ae0: 20 70 49 64 32 2d 3e 6e 3e 30 20 3f 20 70 44 62   pId2->n>0 ? pDb
2af0: 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 3b 0a  ->zDbSName : 0;.
2b00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
2b10: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2b20: 51 4c 49 54 45 5f 50 52 41 47 4d 41 2c 20 7a 4c  QLITE_PRAGMA, zL
2b30: 65 66 74 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  eft, zRight, zDb
2b40: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 72  ) ){.    goto pr
2b50: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  agma_out;.  }.. 
2b60: 20 2f 2a 20 53 65 6e 64 20 61 6e 20 53 51 4c 49   /* Send an SQLI
2b70: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
2b80: 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 74 6f 20  file-control to 
2b90: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  the underlying V
2ba0: 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  FS.  ** connecti
2bb0: 6f 6e 2e 20 20 49 66 20 69 74 20 72 65 74 75 72  on.  If it retur
2bc0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68  ns SQLITE_OK, th
2bd0: 65 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  en assume that t
2be0: 68 65 20 56 46 53 0a 20 20 2a 2a 20 68 61 6e 64  he VFS.  ** hand
2bf0: 6c 65 64 20 74 68 65 20 70 72 61 67 6d 61 20 61  led the pragma a
2c00: 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e 6f  nd generate a no
2c10: 2d 6f 70 20 70 72 65 70 61 72 65 64 20 73 74 61  -op prepared sta
2c20: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  tement..  **.  *
2c30: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
2c40: 2d 4f 46 3a 20 52 2d 31 32 32 33 38 2d 35 35 31  -OF: R-12238-551
2c50: 32 30 20 57 68 65 6e 65 76 65 72 20 61 20 50 52  20 Whenever a PR
2c60: 41 47 4d 41 20 73 74 61 74 65 6d 65 6e 74 20 69  AGMA statement i
2c70: 73 20 70 61 72 73 65 64 2c 0a 20 20 2a 2a 20 61  s parsed,.  ** a
2c80: 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  n SQLITE_FCNTL_P
2c90: 52 41 47 4d 41 20 66 69 6c 65 20 63 6f 6e 74 72  RAGMA file contr
2ca0: 6f 6c 20 69 73 20 73 65 6e 74 20 74 6f 20 74 68  ol is sent to th
2cb0: 65 20 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 66  e open sqlite3_f
2cc0: 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  ile.  ** object 
2cd0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2ce0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cf0: 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  le to which the 
2d00: 70 72 61 67 6d 61 0a 20 20 2a 2a 20 73 74 61 74  pragma.  ** stat
2d10: 65 6d 65 6e 74 20 72 65 66 65 72 73 2e 0a 20 20  ement refers..  
2d20: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
2d30: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 39 38  TATION-OF: R-298
2d40: 37 35 2d 33 31 36 37 38 20 54 68 65 20 61 72 67  75-31678 The arg
2d50: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 53 51 4c  ument to the SQL
2d60: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
2d70: 0a 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 74 72  .  ** file contr
2d80: 6f 6c 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ol is an array o
2d90: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74  f pointers to st
2da0: 72 69 6e 67 73 20 28 63 68 61 72 2a 2a 29 20 69  rings (char**) i
2db0: 6e 20 77 68 69 63 68 20 74 68 65 0a 20 20 2a 2a  n which the.  **
2dc0: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
2dd0: 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
2de0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2df0: 70 72 61 67 6d 61 20 61 6e 64 20 74 68 65 20 74  pragma and the t
2e00: 68 69 72 64 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  hird.  ** elemen
2e10: 74 20 69 73 20 74 68 65 20 61 72 67 75 6d 65 6e  t is the argumen
2e20: 74 20 74 6f 20 74 68 65 20 70 72 61 67 6d 61 20  t to the pragma 
2e30: 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  or NULL if the p
2e40: 72 61 67 6d 61 20 68 61 73 20 6e 6f 0a 20 20 2a  ragma has no.  *
2e50: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 2a 2f  * argument..  */
2e60: 0a 20 20 61 46 63 6e 74 6c 5b 30 5d 20 3d 20 30  .  aFcntl[0] = 0
2e70: 3b 0a 20 20 61 46 63 6e 74 6c 5b 31 5d 20 3d 20  ;.  aFcntl[1] = 
2e80: 7a 4c 65 66 74 3b 0a 20 20 61 46 63 6e 74 6c 5b  zLeft;.  aFcntl[
2e90: 32 5d 20 3d 20 7a 52 69 67 68 74 3b 0a 20 20 61  2] = zRight;.  a
2ea0: 46 63 6e 74 6c 5b 33 5d 20 3d 20 30 3b 0a 20 20  Fcntl[3] = 0;.  
2eb0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
2ec0: 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 72 63 20  nBusy = 0;.  rc 
2ed0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
2ee0: 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
2ef0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2f00: 47 4d 41 2c 20 28 76 6f 69 64 2a 29 61 46 63 6e  GMA, (void*)aFcn
2f10: 74 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  tl);.  if( rc==S
2f20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
2f40: 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20  mCols(v, 1);.   
2f50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
2f60: 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c  olName(v, 0, COL
2f70: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61 46 63 6e 74  NAME_NAME, aFcnt
2f80: 6c 5b 30 5d 2c 20 53 51 4c 49 54 45 5f 54 52 41  l[0], SQLITE_TRA
2f90: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 72 65 74  NSIENT);.    ret
2fa0: 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c  urnSingleText(v,
2fb0: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
2fc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46   sqlite3_free(aF
2fd0: 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 67 6f  cntl[0]);.    go
2fe0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
2ff0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
3000: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
3010: 20 20 20 20 69 66 28 20 61 46 63 6e 74 6c 5b 30      if( aFcntl[0
3020: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
3030: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3040: 65 2c 20 22 25 73 22 2c 20 61 46 63 6e 74 6c 5b  e, "%s", aFcntl[
3050: 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0]);.      sqlit
3060: 65 33 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30  e3_free(aFcntl[0
3070: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ]);.    }.    pP
3080: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3090: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
30a0: 63 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67  c;.    goto prag
30b0: 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ma_out;.  }..  /
30c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 70 72 61  * Locate the pra
30d0: 67 6d 61 20 69 6e 20 74 68 65 20 6c 6f 6f 6b 75  gma in the looku
30e0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 50 72  p table */.  pPr
30f0: 61 67 6d 61 20 3d 20 70 72 61 67 6d 61 4c 6f 63  agma = pragmaLoc
3100: 61 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66  ate(zLeft);.  if
3110: 28 20 70 50 72 61 67 6d 61 3d 3d 30 20 29 20 67  ( pPragma==0 ) g
3120: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
3130: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
3140: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
3150: 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 20 69 66  ema is loaded if
3160: 20 74 68 65 20 70 72 61 67 6d 61 20 72 65 71 75   the pragma requ
3170: 69 72 65 73 20 74 68 61 74 20 2a 2f 0a 20 20 69  ires that */.  i
3180: 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
3190: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
31a0: 4e 65 65 64 53 63 68 65 6d 61 29 21 3d 30 20 29  NeedSchema)!=0 )
31b0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
31c0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
31d0: 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  se) ) goto pragm
31e0: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  a_out;.  }..  /*
31f0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 72 65   Register the re
3200: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
3210: 73 20 66 6f 72 20 70 72 61 67 6d 61 73 20 74 68  s for pragmas th
3220: 61 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  at return result
3230: 73 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  s */.  if( (pPra
3240: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
3250: 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e  PragFlg_NoColumn
3260: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 74  s)==0 ){.    set
3270: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
3280: 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67  mnNames(v, pPrag
3290: 6d 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ma);.  }..  /* J
32a0: 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72 6f  ump to the appro
32b0: 70 72 69 61 74 65 20 70 72 61 67 6d 61 20 68 61  priate pragma ha
32c0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 73 77 69 74 63  ndler */.  switc
32d0: 68 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61  h( pPragma->ePra
32e0: 67 54 79 70 20 29 7b 0a 20 20 0a 23 69 66 20 21  gTyp ){.  .#if !
32f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3300: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3310: 53 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  S) && !defined(S
3320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
3330: 43 41 54 45 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a  CATED).  /*.  **
3340: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3350: 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f  .]default_cache_
3360: 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  PRAGM
3370: 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75  A [schema.]defau
3380: 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a  lt_cache_size=N.
3390: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
33a0: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
33b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 65 72   the current per
33c0: 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20  sistent setting 
33d0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
33e0: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54  e cache size.  T
33f0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
3400: 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  d is the maximum
3410: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
3420: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
3430: 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65  e cache.  The se
3440: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62  cond form sets b
3450: 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a  oth the current.
3460: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3470: 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74  size value and t
3480: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 70 61  he persistent pa
3490: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
34a0: 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  lue.  ** stored 
34b0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
34c0: 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file..  **.  ** 
34d0: 4f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  Older versions o
34e0: 66 20 53 51 4c 69 74 65 20 77 6f 75 6c 64 20 73  f SQLite would s
34f0: 65 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  et the default c
3500: 61 63 68 65 20 73 69 7a 65 20 74 6f 20 61 0a 20  ache size to a. 
3510: 20 2a 2a 20 6e 65 67 61 74 69 76 65 20 6e 75 6d   ** negative num
3520: 62 65 72 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ber to indicate 
3530: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e  synchronous=OFF.
3540: 20 20 54 68 65 73 65 20 64 61 79 73 2c 20 73 79    These days, sy
3550: 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69  nchronous.  ** i
3560: 73 20 61 6c 77 61 79 73 20 6f 6e 20 62 79 20 64  s always on by d
3570: 65 66 61 75 6c 74 20 72 65 67 61 72 64 6c 65 73  efault regardles
3580: 73 20 6f 66 20 74 68 65 20 73 69 67 6e 20 6f 66  s of the sign of
3590: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63   the default cac
35a0: 68 65 0a 20 20 2a 2a 20 73 69 7a 65 2e 20 20 42  he.  ** size.  B
35b0: 75 74 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74  ut continue to t
35c0: 61 6b 65 20 74 68 65 20 61 62 73 6f 6c 75 74 65  ake the absolute
35d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 65   value of the de
35e0: 66 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a  fault cache.  **
35f0: 20 73 69 7a 65 20 6f 66 20 68 69 73 74 6f 72 69   size of histori
3600: 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
3610: 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  y..  */.  case P
3620: 72 61 67 54 79 70 5f 44 45 46 41 55 4c 54 5f 43  ragTyp_DEFAULT_C
3630: 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  ACHE_SIZE: {.   
3640: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
3650: 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46  t iLn = VDBE_OFF
3660: 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20  SET_LINENO(2);. 
3670: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
3680: 56 64 62 65 4f 70 4c 69 73 74 20 67 65 74 43 61  VdbeOpList getCa
3690: 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20  cheSize[] = {.  
36a0: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
36b0: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 20 20 20 20  tion, 0, 0,     
36c0: 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20     0},          
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36e0: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 0 */.      { O
36f0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30  P_ReadCookie,  0
3700: 2c 20 31 2c 20 20 20 20 20 20 20 20 42 54 52 45  , 1,        BTRE
3710: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
3720: 53 49 5a 45 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a  SIZE},  /* 1 */.
3730: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73        { OP_IfPos
3740: 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20  ,       1, 8,   
3750: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
3760: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
3770: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
3780: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 75 62  ,.      { OP_Sub
3790: 74 72 61 63 74 2c 20 20 20 20 31 2c 20 32 2c 20  tract,    1, 2, 
37a0: 20 20 20 20 20 20 20 31 7d 2c 0a 20 20 20 20 20         1},.     
37b0: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
37c0: 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20 20     1, 8,        
37d0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
37e0: 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 31  nteger,     0, 1
37f0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20       /* 6 */.   
3820: 20 20 20 7b 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20     { OP_Noop,   
3830: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
3840: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
3850: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 31 2c  _ResultRow,   1,
3860: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
3870: 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f 70     };.    VdbeOp
3880: 20 2a 61 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74   *aOp;.    sqlit
3890: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
38a0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  v, iDb);.    if(
38b0: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
38c0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
38d0: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
38e0: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
38f0: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20  llocRequired(v, 
3900: 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61 63  ArraySize(getCac
3910: 68 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  heSize));.      
3920: 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  aOp = sqlite3Vdb
3930: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
3940: 72 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65  raySize(getCache
3950: 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53  Size), getCacheS
3960: 69 7a 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20  ize, iLn);.     
3970: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
3980: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
3990: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
39a0: 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69     aOp[0].p1 = i
39b0: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
39c0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
39d0: 20 61 4f 70 5b 36 5d 2e 70 31 20 3d 20 53 51 4c   aOp[6].p1 = SQL
39e0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
39f0: 45 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73  E_SIZE;.    }els
3a00: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  e{.      int siz
3a10: 65 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  e = sqlite3AbsIn
3a20: 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28  t32(sqlite3Atoi(
3a30: 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 20 20  zRight));.      
3a40: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
3a50: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
3a60: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
3a70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3a80: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
3a90: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
3aa0: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3ab0: 5a 45 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20  ZE, size);.     
3ac0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3ad0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3ae0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3af0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
3b00: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  a->cache_size = 
3b10: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
3b20: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
3b30: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
3b40: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
3b50: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
3b60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
3b70: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
3b80: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
3b90: 4d 41 53 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  MAS && !SQLITE_O
3ba0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a  MIT_DEPRECATED *
3bb0: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
3bc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3bd0: 52 5f 50 52 41 47 4d 41 53 29 0a 20 20 2f 2a 0a  R_PRAGMAS).  /*.
3be0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
3bf0: 68 65 6d 61 2e 5d 70 61 67 65 5f 73 69 7a 65 0a  hema.]page_size.
3c00: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
3c10: 68 65 6d 61 2e 5d 70 61 67 65 5f 73 69 7a 65 3d  hema.]page_size=
3c20: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
3c30: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
3c40: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
3c50: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
3c60: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
3c70: 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e  e size in bytes.
3c80: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
3c90: 6d 20 73 65 74 73 20 74 68 65 0a 20 20 2a 2a 20  m sets the.  ** 
3ca0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
3cb0: 7a 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20 76  ze value.  The v
3cc0: 61 6c 75 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65  alue can only be
3cd0: 20 73 65 74 20 69 66 0a 20 20 2a 2a 20 74 68 65   set if.  ** the
3ce0: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
3cf0: 74 20 79 65 74 20 62 65 65 6e 20 63 72 65 61 74  t yet been creat
3d00: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
3d10: 50 72 61 67 54 79 70 5f 50 41 47 45 5f 53 49 5a  PragTyp_PAGE_SIZ
3d20: 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  E: {.    Btree *
3d30: 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a  pBt = pDb->pBt;.
3d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21      assert( pBt!
3d50: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  =0 );.    if( !z
3d60: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
3d70: 6e 74 20 73 69 7a 65 20 3d 20 41 4c 57 41 59 53  nt size = ALWAYS
3d80: 28 70 42 74 29 20 3f 20 73 71 6c 69 74 65 33 42  (pBt) ? sqlite3B
3d90: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
3da0: 70 42 74 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  pBt) : 0;.      
3db0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
3dc0: 76 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65  v, size);.    }e
3dd0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61  lse{.      /* Ma
3de0: 6c 6c 6f 63 20 6d 61 79 20 66 61 69 6c 20 77 68  lloc may fail wh
3df0: 65 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 70  en setting the p
3e00: 61 67 65 2d 73 69 7a 65 2c 20 61 73 20 74 68 65  age-size, as the
3e10: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  re is an interna
3e20: 6c 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  l.      ** buffe
3e30: 72 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  r that the pager
3e40: 20 6d 6f 64 75 6c 65 20 72 65 73 69 7a 65 73 20   module resizes 
3e50: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 72 65  using sqlite3_re
3e60: 61 6c 6c 6f 63 28 29 2e 0a 20 20 20 20 20 20 2a  alloc()..      *
3e70: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74  /.      db->next
3e80: 50 61 67 65 73 69 7a 65 20 3d 20 73 71 6c 69 74  Pagesize = sqlit
3e90: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
3ea0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
3eb0: 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42  _NOMEM==sqlite3B
3ec0: 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
3ed0: 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67  pBt, db->nextPag
3ee0: 65 73 69 7a 65 2c 2d 31 2c 30 29 20 29 7b 0a 20  esize,-1,0) ){. 
3ef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
3f00: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
3f10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
3f20: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
3f30: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
3f40: 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65  ema.]secure_dele
3f50: 74 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  te.  **  PRAGMA 
3f60: 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f  [schema.]secure_
3f70: 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46 46 0a 20 20  delete=ON/OFF.  
3f80: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
3f90: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
3fa0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
3fb0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
3fc0: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66 6c  secure_delete fl
3fd0: 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ag.  The second 
3fe0: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
3ff0: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
4000: 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e 67   ** flag setting
4010: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68 65   and reports the
4020: 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  new value..  */.
4030: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
4040: 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20 7b 0a  ECURE_DELETE: {.
4050: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4060: 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 69   pDb->pBt;.    i
4070: 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61  nt b = -1;.    a
4080: 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b  ssert( pBt!=0 );
4090: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
40a0: 29 7b 0a 20 20 20 20 20 20 62 20 3d 20 73 71 6c  ){.      b = sql
40b0: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
40c0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 7d  Right, 0);.    }
40d0: 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e  .    if( pId2->n
40e0: 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29 7b 0a 20  ==0 && b>=0 ){. 
40f0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
4100: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
4110: 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a  db->nDb; ii++){.
4120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
4130: 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
4140: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4150: 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , b);.      }.  
4160: 20 20 7d 0a 20 20 20 20 62 20 3d 20 73 71 6c 69    }.    b = sqli
4170: 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
4180: 6c 65 74 65 28 70 42 74 2c 20 62 29 3b 0a 20 20  lete(pBt, b);.  
4190: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
41a0: 74 28 76 2c 20 62 29 3b 0a 20 20 20 20 62 72 65  t(v, b);.    bre
41b0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
41c0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
41d0: 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75  ma.]max_page_cou
41e0: 6e 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  nt.  **  PRAGMA 
41f0: 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67  [schema.]max_pag
4200: 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a 0a 20  e_count=N.  **. 
4210: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
4220: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
4230: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
4240: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69  or the.  ** maxi
4250: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
4260: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
4270: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 0a  ase file.  The .
4280: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d    ** second form
4290: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61   attempts to cha
42a0: 6e 67 65 20 74 68 69 73 20 73 65 74 74 69 6e 67  nge this setting
42b0: 2e 20 20 42 6f 74 68 0a 20 20 2a 2a 20 66 6f 72  .  Both.  ** for
42c0: 6d 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  ms return the cu
42d0: 72 72 65 6e 74 20 73 65 74 74 69 6e 67 2e 0a 20  rrent setting.. 
42e0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 62 73   **.  ** The abs
42f0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 4e  olute value of N
4300: 20 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20   is used.  This 
4310: 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  is undocumented 
4320: 61 6e 64 20 6d 69 67 68 74 0a 20 20 2a 2a 20 63  and might.  ** c
4330: 68 61 6e 67 65 2e 20 20 54 68 65 20 6f 6e 6c 79  hange.  The only
4340: 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 70   purpose is to p
4350: 72 6f 76 69 64 65 20 61 6e 20 65 61 73 79 20 77  rovide an easy w
4360: 61 79 20 74 6f 20 74 65 73 74 0a 20 20 2a 2a 20  ay to test.  ** 
4370: 74 68 65 20 73 71 6c 69 74 65 33 41 62 73 49 6e  the sqlite3AbsIn
4380: 74 33 32 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  t32() function..
4390: 20 20 2a 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    **.  **  PRAGM
43a0: 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f  A [schema.]page_
43b0: 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  count.  **.  ** 
43c0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
43d0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
43e0: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
43f0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
4400: 65 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f 43  e PragTyp_PAGE_C
4410: 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OUNT: {.    int 
4420: 69 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  iReg;.    sqlite
4430: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
4440: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
4450: 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61      iReg = ++pPa
4460: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
4470: 66 28 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  f( sqlite3Tolowe
4480: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 70 27  r(zLeft[0])=='p'
4490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
44a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
44b0: 50 5f 50 61 67 65 63 6f 75 6e 74 2c 20 69 44 62  P_Pagecount, iDb
44c0: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
44d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
44e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
44f0: 50 5f 4d 61 78 50 67 63 6e 74 2c 20 69 44 62 2c  P_MaxPgcnt, iDb,
4500: 20 69 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20   iReg, .        
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
4530: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
4540: 68 74 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ht)));.    }.   
4550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4560: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
4570: 6f 77 2c 20 69 52 65 67 2c 20 31 29 3b 0a 20 20  ow, iReg, 1);.  
4580: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4590: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
45a0: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e 67  [schema.]locking
45b0: 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47  _mode.  **  PRAG
45c0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
45d0: 69 6e 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f 72 6d  ing_mode = (norm
45e0: 61 6c 7c 65 78 63 6c 75 73 69 76 65 29 0a 20 20  al|exclusive).  
45f0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4600: 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3a 20  p_LOCKING_MODE: 
4610: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
4620: 20 2a 7a 52 65 74 20 3d 20 22 6e 6f 72 6d 61 6c   *zRet = "normal
4630: 22 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65  ";.    int eMode
4640: 20 3d 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64   = getLockingMod
4650: 65 28 7a 52 69 67 68 74 29 3b 0a 0a 20 20 20 20  e(zRight);..    
4660: 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26  if( pId2->n==0 &
4670: 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  & eMode==PAGER_L
4680: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
4690: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6d   ){.      /* Sim
46a0: 70 6c 65 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b  ple "PRAGMA lock
46b0: 69 6e 67 5f 6d 6f 64 65 3b 22 20 73 74 61 74 65  ing_mode;" state
46c0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20  ment. This is a 
46d0: 71 75 65 72 79 20 66 6f 72 0a 20 20 20 20 20 20  query for.      
46e0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  ** the current d
46f0: 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 6d  efault locking m
4700: 6f 64 65 20 28 77 68 69 63 68 20 6d 61 79 20 62  ode (which may b
4710: 65 20 64 69 66 66 65 72 65 6e 74 20 74 6f 0a 20  e different to. 
4720: 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b       ** the lock
4730: 69 6e 67 2d 6d 6f 64 65 20 6f 66 20 74 68 65 20  ing-mode of the 
4740: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 29 2e 0a  main database)..
4750: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65        */.      e
4760: 4d 6f 64 65 20 3d 20 64 62 2d 3e 64 66 6c 74 4c  Mode = db->dfltL
4770: 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c  ockMode;.    }el
4780: 73 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20  se{.      Pager 
4790: 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 69  *pPager;.      i
47a0: 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b  f( pId2->n==0 ){
47b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
47c0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
47d0: 6e 6f 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  no database name
47e0: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61   was specified a
47f0: 73 20 70 61 72 74 0a 20 20 20 20 20 20 20 20 2a  s part.        *
4800: 2a 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  * of the PRAGMA 
4810: 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 69 73  command. In this
4820: 20 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e   case the lockin
4830: 67 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 0a 20  g-mode must be. 
4840: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e         ** set on
4850: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
4860: 74 61 62 61 73 65 73 2c 20 61 73 20 77 65 6c 6c  tabases, as well
4870: 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 62 20   as the main db 
4880: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  file..        **
4890: 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  .        ** Also
48a0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 2e 64 66  , the sqlite3.df
48b0: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76 61 72 69 61  ltLockMode varia
48c0: 62 6c 65 20 69 73 20 73 65 74 20 73 6f 20 74 68  ble is set so th
48d0: 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  at.        ** an
48e0: 79 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 61  y subsequently a
48f0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4900: 73 20 61 6c 73 6f 20 75 73 65 20 74 68 65 20 73  s also use the s
4910: 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 20  pecified.       
4920: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65   ** locking mode
4930: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4940: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
4950: 20 20 20 20 20 61 73 73 65 72 74 28 70 44 62 3d       assert(pDb=
4960: 3d 26 64 62 2d 3e 61 44 62 5b 30 5d 29 3b 0a 20  =&db->aDb[0]);. 
4970: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 3b         for(ii=2;
4980: 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
4990: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +){.          pP
49a0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
49b0: 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
49c0: 5b 69 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  [ii].pBt);.     
49d0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
49e0: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61  rLockingMode(pPa
49f0: 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ger, eMode);.   
4a00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
4a10: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
4a20: 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20  = (u8)eMode;.   
4a30: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
4a40: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
4a50: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
4a60: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 73  .      eMode = s
4a70: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
4a80: 6e 67 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65  ngMode(pPager, e
4a90: 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mode);.    }..  
4aa0: 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
4ab0: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4ac0: 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
4ad0: 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
4ae0: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4af0: 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
4b00: 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41     if( eMode==PA
4b10: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
4b20: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
4b30: 20 20 20 7a 52 65 74 20 3d 20 22 65 78 63 6c 75     zRet = "exclu
4b40: 73 69 76 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20  sive";.    }.   
4b50: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
4b60: 74 28 76 2c 20 7a 52 65 74 29 3b 0a 20 20 20 20  t(v, zRet);.    
4b70: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
4b80: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
4b90: 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d  chema.]journal_m
4ba0: 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ode.  **  PRAGMA
4bb0: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
4bc0: 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20  l_mode =.  **   
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69     (delete|persi
4bf0: 73 74 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c  st|off|truncate|
4c00: 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a  memory|wal|off).
4c10: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4c20: 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f 44 45  Typ_JOURNAL_MODE
4c30: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64  : {.    int eMod
4c40: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  e;        /* One
4c50: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
4c60: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79  URNALMODE_XXX sy
4c70: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  mbols */.    int
4c80: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f   ii;           /
4c90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
4ca0: 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  /..    if( zRigh
4cb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
4cc0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
4cd0: 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 6f 66 20  "=MODE" part of 
4ce0: 74 68 65 20 70 72 61 67 6d 61 2c 20 64 6f 20 61  the pragma, do a
4cf0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20   query for the. 
4d00: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
4d10: 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 65 4d  mode */.      eM
4d20: 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
4d30: 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20  NALMODE_QUERY;. 
4d40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
4d60: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  e;.      int n =
4d70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4d80: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
4d90: 66 6f 72 28 65 4d 6f 64 65 3d 30 3b 20 28 7a 4d  for(eMode=0; (zM
4da0: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75  ode = sqlite3Jou
4db0: 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4d 6f  rnalModename(eMo
4dc0: 64 65 29 29 21 3d 30 3b 20 65 4d 6f 64 65 2b 2b  de))!=0; eMode++
4dd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
4de0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
4df0: 52 69 67 68 74 2c 20 7a 4d 6f 64 65 2c 20 6e 29  Right, zMode, n)
4e00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4e10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
4e20: 7a 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  zMode ){.       
4e30: 20 2f 2a 20 49 66 20 74 68 65 20 22 3d 4d 4f 44   /* If the "=MOD
4e40: 45 22 20 70 61 72 74 20 64 6f 65 73 20 6e 6f 74  E" part does not
4e50: 20 6d 61 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e   match any known
4e60: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 0a 20   journal mode,. 
4e70: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
4e80: 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  o a query */.   
4e90: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
4ea0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
4eb0: 55 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UERY;.      }.  
4ec0: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64    }.    if( eMod
4ed0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
4ee0: 4d 4f 44 45 5f 51 55 45 52 59 20 26 26 20 70 49  MODE_QUERY && pI
4ef0: 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  d2->n==0 ){.    
4f00: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52    /* Convert "PR
4f10: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
4f20: 65 22 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20  e" into "PRAGMA 
4f30: 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  main.journal_mod
4f40: 65 22 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20  e" */.      iDb 
4f50: 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d  = 0;.      pId2-
4f60: 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  >n = 1;.    }.  
4f70: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
4f80: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
4f90: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
4fa0: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
4fb0: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
4fc0: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
4fd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
4fe0: 73 42 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20  sBtree(v, ii);. 
4ff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5000: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
5010: 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20  ournalMode, ii, 
5020: 31 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  1, eMode);.     
5030: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5050: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5060: 31 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b  1, 1);.    break
5070: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
5080: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5090: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
50a0: 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d  imit.  **  PRAGM
50b0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
50c0: 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a  al_size_limit=N.
50d0: 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72    **.  ** Get or
50e0: 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69   set the size li
50f0: 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  mit on rollback 
5100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20  journal files.. 
5110: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
5120: 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  yp_JOURNAL_SIZE_
5130: 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67  LIMIT: {.    Pag
5140: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
5150: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
5160: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36  Db->pBt);.    i6
5170: 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20  4 iLimit = -2;. 
5180: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
5190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
51a0: 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
51b0: 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20  ht, &iLimit);.  
51c0: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d      if( iLimit<-
51d0: 31 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  1 ) iLimit = -1;
51e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69  .    }.    iLimi
51f0: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
5200: 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
5210: 28 70 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29  (pPager, iLimit)
5220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
5230: 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29  leInt(v, iLimit)
5240: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
5250: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
5260: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5270: 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  AGMAS */..  /*. 
5280: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5290: 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ema.]auto_vacuum
52a0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
52b0: 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75  chema.]auto_vacu
52c0: 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47  um=N.  **.  ** G
52d0: 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 76 61  et or set the va
52e0: 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
52f0: 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  ase 'auto-vacuum
5300: 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a  ' parameter..  *
5310: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f  * The value is o
5320: 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31  ne of:  0 NONE 1
5330: 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e   FULL 2 INCREMEN
5340: 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  TAL.  */.#ifndef
5350: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5360: 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50  OVACUUM.  case P
5370: 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55  ragTyp_AUTO_VACU
5380: 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  UM: {.    Btree 
5390: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
53a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
53b0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  !=0 );.    if( !
53c0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
53d0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
53e0: 76 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  v, sqlite3BtreeG
53f0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74  etAutoVacuum(pBt
5400: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
5410: 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d       int eAuto =
5420: 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a   getAutoVacuum(z
5430: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
5440: 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26  sert( eAuto>=0 &
5450: 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20  & eAuto<=2 );.  
5460: 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f      db->nextAuto
5470: 76 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b  vac = (u8)eAuto;
5480: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53  .      /* Call S
5490: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74  etAutoVacuum() t
54a0: 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65  o set initialize
54b0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75   the internal au
54c0: 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  to and.      ** 
54d0: 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67  incr-vacuum flag
54e0: 73 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  s. This is requi
54f0: 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
5500: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
5510: 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65    ** creates the
5520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
5530: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
5540: 74 68 61 74 20 69 74 20 69 73 20 63 72 65 61 74  that it is creat
5550: 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61  ed.      ** as a
5560: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  n auto-vacuum ca
5570: 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20  pable db..      
5580: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
5590: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
55a0: 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75  oVacuum(pBt, eAu
55b0: 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  to);.      if( r
55c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
55d0: 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75  (eAuto==1 || eAu
55e0: 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20  to==2) ){.      
55f0: 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e    /* When settin
5600: 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75  g the auto_vacuu
5610: 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72  m mode to either
5620: 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20   "full" or .    
5630: 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e      ** "incremen
5640: 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20  tal", write the 
5650: 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d  value of meta[6]
5660: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5670: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
5680: 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
5690: 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65   to meta[6], che
56a0: 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20  ck that meta[3] 
56b0: 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20 20 20  indicates.      
56c0: 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
56d0: 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f  eally is an auto
56e0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
56f0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
5700: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61    */.        sta
5710: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
5720: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
5730: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20  LINENO(2);.     
5740: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5750: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65  VdbeOpList setMe
5760: 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ta6[] = {.      
5770: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
5780: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20  tion,    0,     
5790: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
57a0: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
57b0: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   0 */.          
57c0: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
57d0: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
57e0: 31 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  1,         BTREE
57f0: 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41  _LARGEST_ROOT_PA
5800: 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b  GE},.          {
5810: 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20   OP_If,         
5820: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 30      1,         0
5830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5840: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
5850: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5860: 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20  Halt,           
5870: 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62  SQLITE_OK, OE_Ab
5880: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d  ort,          0}
5890: 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
58a0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
58b0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
58c0: 20 20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43         BTREE_INC
58d0: 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20  R_VACUUM, 0},   
58e0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20   /* 4 */.       
58f0: 20 7d 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65   };.        Vdbe
5900: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20  Op *aOp;.       
5910: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
5920: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5930: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
5940: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
5950: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
5960: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  d(v, ArraySize(s
5970: 65 74 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20  etMeta6));.     
5980: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
5990: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
59a0: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65   ArraySize(setMe
59b0: 74 61 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20  ta6), setMeta6, 
59c0: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iLn);.        if
59d0: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
59e0: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
59f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5a00: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
5a10: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31  b;.        aOp[1
5a20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
5a30: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20      aOp[2].p2 = 
5a40: 69 41 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20  iAddr+4;.       
5a50: 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62   aOp[4].p1 = iDb
5a60: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d  ;.        aOp[4]
5a70: 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b  .p3 = eAuto - 1;
5a80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5a90: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5aa0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
5ab0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
5ac0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
5ad0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5ae0: 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74  chema.]increment
5af0: 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a  al_vacuum(N).  *
5b00: 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70  *.  ** Do N step
5b10: 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s of incremental
5b20: 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20   vacuuming on a 
5b30: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
5b40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5b50: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
5b60: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43  case PragTyp_INC
5b70: 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a  REMENTAL_VACUUM:
5b80: 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69   {.    int iLimi
5b90: 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28  t, addr;.    if(
5ba0: 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73   zRight==0 || !s
5bb0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
5bc0: 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20  Right, &iLimit) 
5bd0: 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  || iLimit<=0 ){.
5be0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30        iLimit = 0
5bf0: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d  x7fffffff;.    }
5c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
5c10: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
5c20: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
5c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5c40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
5c50: 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29  eger, iLimit, 1)
5c60: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
5c70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5c80: 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c  , OP_IncrVacuum,
5c90: 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72   iDb); VdbeCover
5ca0: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
5cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5cc0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
5cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5ce0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
5cf0: 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20  ddImm, 1, -1);. 
5d00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d10: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
5d20: 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65  , 1, addr); Vdbe
5d30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
5d40: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
5d50: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
5d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
5d70: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
5d80: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
5d90: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
5da0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5db0: 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  a.]cache_size.  
5dc0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
5dd0: 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e  ma.]cache_size=N
5de0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
5df0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
5e00: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
5e10: 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20  cal setting for 
5e20: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
5e30: 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65  che size. The se
5e40: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
5e50: 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61  he local.  ** pa
5e60: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
5e70: 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f  lue.  If N is po
5e80: 73 69 74 69 76 65 20 74 68 65 6e 20 74 68 61 74  sitive then that
5e90: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d   is the.  ** num
5ea0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
5eb0: 74 68 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e  the cache.  If N
5ec0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
5ed0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  en the.  ** numb
5ee0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 61  er of pages is a
5ef0: 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61 74 20  djusted so that 
5f00: 74 68 65 20 63 61 63 68 65 20 75 73 65 73 20 2d  the cache uses -
5f10: 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a  N kibibytes.  **
5f20: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f   of memory..  */
5f30: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
5f40: 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20  CACHE_SIZE: {.  
5f50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5f60: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5f70: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5f80: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
5f90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
5fa0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
5fb0: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
5fc0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  size);.    }else
5fd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
5fe0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
5ff0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44  Right);.      pD
6000: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
6010: 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  e_size = size;. 
6020: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6030: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44  eSetCacheSize(pD
6040: 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63  b->pBt, pDb->pSc
6050: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
6060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
6070: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6080: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6090: 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a  ma.]cache_spill.
60a0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
60b0: 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e  he_spill=BOOLEAN
60c0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
60d0: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69  chema.]cache_spi
60e0: 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ll=N.  **.  ** T
60f0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
6100: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
6110: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
6120: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
6130: 65 20 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69  e cache spill si
6140: 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66  ze. The second f
6150: 6f 72 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20  orm turns cache 
6160: 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72  spill on.  ** or
6170: 20 6f 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e   off.  When turn
6180: 6e 69 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c  ning cache spill
6190: 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73   on, the size is
61a0: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
61b0: 20 63 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73   current cache_s
61c0: 69 7a 65 2e 20 20 54 68 65 20 74 68 69 72 64 20  ize.  The third 
61d0: 66 6f 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c  form sets a spil
61e0: 6c 20 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a  l size that.  **
61f0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
6200: 74 20 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65  t form the cache
6210: 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e   size..  ** If N
6220: 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65   is positive the
6230: 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  n that is the.  
6240: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6250: 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
6260: 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69    If N is negati
6270: 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ve, then the.  *
6280: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
6290: 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f  s is adjusted so
62a0: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
62b0: 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65  uses -N kibibyte
62c0: 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  s.  ** of memory
62d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
62e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  he number of cac
62f0: 68 65 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69  he_spill pages i
6300: 73 20 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20  s less then the 
6310: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
6320: 61 63 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c  ache_size pages,
6330: 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63   no spilling occ
6340: 75 72 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61  urs until the pa
6350: 67 65 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73  ge count exceeds
6360: 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
6370: 20 6f 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70   of cache_size p
6380: 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ages..  **.  ** 
6390: 54 68 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  The cache_spill=
63a0: 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20  BOOLEAN setting 
63b0: 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61  applies to all a
63c0: 74 74 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c  ttached schemas,
63d0: 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74  .  ** not just t
63e0: 68 65 20 73 63 68 65 6d 61 20 73 70 65 63 69 66  he schema specif
63f0: 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ied..  */.  case
6400: 20 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53   PragTyp_CACHE_S
6410: 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65  PILL: {.    asse
6420: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6430: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6440: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6450: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
6460: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6470: 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28  nt(v,.         (
6480: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6490: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d  TE_CacheSpill)==
64a0: 30 20 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20  0 ? 0 : .       
64b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
64c0: 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44  eSetSpillSize(pD
64d0: 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20  b->pBt,0));.    
64e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
64f0: 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20   size = 1;.     
6500: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
6510: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69  nt32(zRight, &si
6520: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ze) ){.        s
6530: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70  qlite3BtreeSetSp
6540: 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74  illSize(pDb->pBt
6550: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  , size);.      }
6560: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6570: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
6580: 67 68 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b  ght, size!=0) ){
6590: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
65a0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63  gs |= SQLITE_Cac
65b0: 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d  heSpill;.      }
65c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
65d0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
65e0: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20  TE_CacheSpill;. 
65f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74       }.      set
6600: 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62  AllPagerFlags(db
6610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
6620: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6630: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6640: 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29  ma.]mmap_size(N)
6650: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  **.  ** Used 
6660: 74 6f 20 73 65 74 20 6d 61 70 70 69 6e 67 20 73  to set mapping s
6670: 69 7a 65 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d  ize limit. The m
6680: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
6690: 74 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 74  t is.  ** used t
66a0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 61 67 67 72  o limit the aggr
66b0: 65 67 61 74 65 20 73 69 7a 65 20 6f 66 20 61 6c  egate size of al
66c0: 6c 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  l memory mapped 
66d0: 72 65 67 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  regions of the. 
66e0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
66f0: 65 2e 20 49 66 20 74 68 69 73 20 70 61 72 61 6d  e. If this param
6700: 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 7a  eter is set to z
6710: 65 72 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ero, then memory
6720: 20 6d 61 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73   mapping.  ** is
6730: 20 6e 6f 74 20 75 73 65 64 20 61 74 20 61 6c 6c   not used at all
6740: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6750: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ive, then the de
6760: 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70  fault memory map
6770: 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65  .  ** limit dete
6780: 72 6d 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65  rmined by sqlite
6790: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
67a0: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
67b0: 29 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54  ) is set..  ** T
67c0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 4e 20 69  he parameter N i
67d0: 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79  s measured in by
67e0: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
67f0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 64 76  his value is adv
6800: 69 73 6f 72 79 2e 20 20 54 68 65 20 75 6e 64 65  isory.  The unde
6810: 72 6c 79 69 6e 67 20 56 46 53 20 69 73 20 66 72  rlying VFS is fr
6820: 65 65 20 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70  ee to memory map
6830: 0a 20 20 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20  .  ** as little 
6840: 6f 72 20 61 73 20 6d 75 63 68 20 61 73 20 69 74  or as much as it
6850: 20 77 61 6e 74 73 2e 20 20 45 78 63 65 70 74 2c   wants.  Except,
6860: 20 69 66 20 4e 20 69 73 20 73 65 74 20 74 6f 20   if N is set to 
6870: 30 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  0 then the.  ** 
6880: 75 70 70 65 72 20 6c 61 79 65 72 73 20 77 69 6c  upper layers wil
6890: 6c 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 74  l never invoke t
68a0: 68 65 20 78 46 65 74 63 68 20 69 6e 74 65 72 66  he xFetch interf
68b0: 61 63 65 73 20 74 6f 20 74 68 65 20 56 46 53 2e  aces to the VFS.
68c0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
68d0: 67 54 79 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  gTyp_MMAP_SIZE: 
68e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
68f0: 74 36 34 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49  t64 sz;.#if SQLI
6900: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
6910: 3e 30 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  >0.    assert( s
6920: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
6930: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
6940: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  ) );.    if( zRi
6950: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ght ){.      int
6960: 20 69 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   ii;.      sqlit
6970: 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
6980: 7a 52 69 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20  zRight, &sz);.  
6990: 20 20 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73      if( sz<0 ) s
69a0: 7a 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  z = sqlite3Globa
69b0: 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
69c0: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
69d0: 6e 3d 3d 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61  n==0 ) db->szMma
69e0: 70 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f  p = sz;.      fo
69f0: 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  r(ii=db->nDb-1; 
6a00: 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20  ii>=0; ii--){.  
6a10: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
6a20: 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28 69 69  b[ii].pBt && (ii
6a30: 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e  ==iDb || pId2->n
6a40: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
6a50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
6a60: 74 4d 6d 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61  tMmapLimit(db->a
6a70: 44 62 5b 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b  Db[ii].pBt, sz);
6a80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6a90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20   }.    }.    sz 
6aa0: 3d 20 2d 31 3b 0a 20 20 20 20 72 63 20 3d 20 73  = -1;.    rc = s
6ab0: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
6ac0: 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
6ad0: 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
6ae0: 49 5a 45 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65  IZE, &sz);.#else
6af0: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
6b00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6b10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
6b20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6b30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
6b40: 67 6c 65 49 6e 74 28 76 2c 20 73 7a 29 3b 0a 20  gleInt(v, sz);. 
6b50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
6b60: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
6b70: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
6b80: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
6b90: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
6ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6bb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6bc0: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6bd0: 74 6f 72 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  tore.  **   PRAG
6be0: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20  MA temp_store = 
6bf0: 22 64 65 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72  "default"|"memor
6c00: 79 22 7c 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20  y"|"file".  **. 
6c10: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
6c20: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
6c30: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
6c40: 6f 72 65 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ore flag.  Chang
6c50: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63  ing.  ** the loc
6c60: 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f  al value does no
6c70: 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74  t make changes t
6c80: 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  o the disk file 
6c90: 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c 74 0a  and the default.
6ca0: 20 20 2a 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20    ** value will 
6cb0: 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65 20  be restored the 
6cc0: 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64 61  next time the da
6cd0: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
6ce0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
6cf0: 20 74 68 61 74 20 69 74 20 69 73 20 70 6f 73 73   that it is poss
6d00: 69 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 69 62  ible for the lib
6d10: 72 61 72 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  rary compile-tim
6d20: 65 20 6f 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a  e options to.  *
6d30: 2a 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  * override this 
6d40: 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63  setting.  */.  c
6d50: 61 73 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50  ase PragTyp_TEMP
6d60: 5f 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66  _STORE: {.    if
6d70: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
6d80: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6d90: 6e 74 28 76 2c 20 64 62 2d 3e 74 65 6d 70 5f 73  nt(v, db->temp_s
6da0: 74 6f 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tore);.    }else
6db0: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 65  {.      changeTe
6dc0: 6d 70 53 74 6f 72 61 67 65 28 70 50 61 72 73 65  mpStorage(pParse
6dd0: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , zRight);.    }
6de0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6df0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
6e00: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
6e10: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20  irectory.  **   
6e20: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6e30: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22  e_directory = ""
6e40: 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65  |"directory_name
6e50: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6e60: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6e70: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
6e80: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
6e90: 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61  ctory flag.  Cha
6ea0: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
6eb0: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
6ec0: 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74  ific directory t
6ed0: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 65  o be used for te
6ee0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 20  mporary files.. 
6ef0: 20 2a 2a 20 53 65 74 74 69 6e 67 20 74 6f 20 61   ** Setting to a
6f00: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
6f10: 65 72 74 73 20 74 6f 20 74 68 65 20 64 65 66 61  erts to the defa
6f20: 75 6c 74 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ult temporary di
6f30: 72 65 63 74 6f 72 79 20 73 65 61 72 63 68 2e 0a  rectory search..
6f40: 20 20 2a 2a 20 49 66 20 74 65 6d 70 6f 72 61 72    ** If temporar
6f50: 79 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63  y directory is c
6f60: 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 69 6e 76  hanged, then inv
6f70: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
6f80: 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ge..  **.  */.  
6f90: 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 45 4d  case PragTyp_TEM
6fa0: 50 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52  P_STORE_DIRECTOR
6fb0: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  Y: {.    if( !zR
6fc0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
6fd0: 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76  turnSingleText(v
6fe0: 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
6ff0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
7000: 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
7010: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
7020: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
7030: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
7040: 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
7050: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
7060: 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69  ss(db->pVfs, zRi
7070: 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ght, SQLITE_ACCE
7080: 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72  SS_READWRITE, &r
7090: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
70a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
70b0: 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  | res==0 ){.    
70c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
70d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
70e0: 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69  ot a writable di
70f0: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20  rectory");.     
7100: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
7110: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
7120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7130: 28 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  ( SQLITE_TEMP_ST
7140: 4f 52 45 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  ORE==0.       ||
7150: 20 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54   (SQLITE_TEMP_ST
7160: 4f 52 45 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65  ORE==1 && db->te
7170: 6d 70 5f 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20  mp_store<=1).   
7180: 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54      || (SQLITE_T
7190: 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20  EMP_STORE==2 && 
71a0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
71b0: 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
71c0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 54 65      invalidateTe
71d0: 6d 70 53 74 6f 72 61 67 65 28 70 50 61 72 73 65  mpStorage(pParse
71e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
71f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71   sqlite3_free(sq
7200: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
7210: 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28  tory);.      if(
7220: 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20   zRight[0] ){.  
7230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
7240: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73  mp_directory = s
7250: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
7260: 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  %s", zRight);.  
7270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7280: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f     sqlite3_temp_
7290: 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20  directory = 0;. 
72a0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
72b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
72c0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72   */.    }.    br
72d0: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  eak;.  }..#if SQ
72e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a  LITE_OS_WIN.  /*
72f0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64  .  **   PRAGMA d
7300: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
7310: 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ory.  **   PRAGM
7320: 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  A data_store_dir
7330: 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64 69 72  ectory = ""|"dir
7340: 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a  ectory_name".  *
7350: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
7360: 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76   set the local v
7370: 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
7380: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7390: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
73a0: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
73b0: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
73c0: 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62 65 20  directory to be 
73d0: 75 73 65 64 20 66 6f 72 20 64 61 74 61 62 61 73  used for databas
73e0: 65 20 66 69 6c 65 73 20 74 68 61 74 0a 20 20 2a  e files that.  *
73f0: 2a 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  * were specified
7400: 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
7410: 20 70 61 74 68 6e 61 6d 65 2e 20 20 53 65 74 74   pathname.  Sett
7420: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
7430: 72 69 6e 67 20 72 65 76 65 72 74 73 0a 20 20 2a  ring reverts.  *
7440: 2a 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  * to the default
7450: 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74   database direct
7460: 6f 72 79 2c 20 77 68 69 63 68 20 66 6f 72 20 64  ory, which for d
7470: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70  atabase files sp
7480: 65 63 69 66 69 65 64 20 77 69 74 68 0a 20 20 2a  ecified with.  *
7490: 2a 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  * a relative pat
74a0: 68 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  h will probably 
74b0: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
74c0: 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72  current director
74d0: 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  y for the.  ** p
74e0: 72 6f 63 65 73 73 2e 20 20 44 61 74 61 62 61 73  rocess.  Databas
74f0: 65 20 66 69 6c 65 20 73 70 65 63 69 66 69 65 64  e file specified
7500: 20 77 69 74 68 20 61 6e 20 61 62 73 6f 6c 75 74   with an absolut
7510: 65 20 70 61 74 68 20 61 72 65 20 6e 6f 74 20 69  e path are not i
7520: 6d 70 61 63 74 65 64 0a 20 20 2a 2a 20 62 79 20  mpacted.  ** by 
7530: 74 68 69 73 20 73 65 74 74 69 6e 67 2c 20 72 65  this setting, re
7540: 67 61 72 64 6c 65 73 73 20 6f 66 20 69 74 73 20  gardless of its 
7550: 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  value..  **.  */
7560: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
7570: 44 41 54 41 5f 53 54 4f 52 45 5f 44 49 52 45 43  DATA_STORE_DIREC
7580: 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  TORY: {.    if( 
7590: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
75a0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
75b0: 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 64 61 74  t(v, sqlite3_dat
75c0: 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  a_directory);.  
75d0: 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
75e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
75f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
7600: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
7610: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
7620: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
7630: 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20  ccess(db->pVfs, 
7640: 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41  zRight, SQLITE_A
7650: 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c  CCESS_READWRITE,
7660: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
7670: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7680: 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20  K || res==0 ){. 
7690: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
76a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
76b0: 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65   "not a writable
76c0: 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20   directory");.  
76d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
76e0: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  gma_out;.       
76f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7700: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71   sqlite3_free(sq
7710: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7720: 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28  tory);.      if(
7730: 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20   zRight[0] ){.  
7740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
7750: 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73  ta_directory = s
7760: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
7770: 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  %s", zRight);.  
7780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7790: 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
77a0: 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20  directory = 0;. 
77b0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
77c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
77d0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 62 72   */.    }.    br
77e0: 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  eak;.  }.#endif.
77f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
7800: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
7810: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
7820: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63  GMA [schema.]loc
7830: 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a  k_proxy_file.  *
7840: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
7850: 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  ma.]lock_proxy_f
7860: 69 6c 65 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22  ile = ":auto:"|"
7870: 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a  lock_file_path".
7880: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
7890: 20 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c 75   or set the valu
78a0: 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72  e of the lock_pr
78b0: 6f 78 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20  oxy_file flag.  
78c0: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
78d0: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
78e0: 70 65 63 69 66 69 63 20 66 69 6c 65 20 74 6f 20  pecific file to 
78f0: 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74 61  be used for data
7900: 62 61 73 65 20 61 63 63 65 73 73 20 6c 6f 63 6b  base access lock
7910: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63  s..  **.  */.  c
7920: 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b  ase PragTyp_LOCK
7930: 5f 50 52 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20  _PROXY_FILE: {. 
7940: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7950: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
7960: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
7970: 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70  treePager(pDb->p
7980: 42 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Bt);.      char 
7990: 2a 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68  *proxy_file_path
79a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73   = NULL;.      s
79b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
79c0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
79d0: 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
79e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
79f0: 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46  leControlHint(pF
7a00: 69 6c 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ile, SQLITE_GET_
7a10: 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a  LOCKPROXYFILE, .
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 20 20 20 20 20 20 20 20 20 26 70 72 6f 78             &prox
7a40: 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20  y_file_path);.  
7a50: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
7a60: 54 65 78 74 28 76 2c 20 70 72 6f 78 79 5f 66 69  Text(v, proxy_fi
7a70: 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20 7d 65  le_path);.    }e
7a80: 6c 73 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72  lse{.      Pager
7a90: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
7aa0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
7ab0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71  ->pBt);.      sq
7ac0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
7ad0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
7ae0: 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
7af0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
7b00: 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d     if( zRight[0]
7b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d   ){.        res=
7b20: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
7b30: 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49  trol(pFile, SQLI
7b40: 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
7b50: 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  FILE, .         
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 69 67              zRig
7b80: 68 74 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  ht);.      } els
7b90: 65 20 7b 0a 20 20 20 20 20 20 20 20 72 65 73 3d  e {.        res=
7ba0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
7bb0: 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49  trol(pFile, SQLI
7bc0: 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
7bd0: 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  FILE, .         
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
7c00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7c10: 20 69 66 28 20 72 65 73 21 3d 53 51 4c 49 54 45   if( res!=SQLITE
7c20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
7c30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7c40: 50 61 72 73 65 2c 20 22 66 61 69 6c 65 64 20 74  Parse, "failed t
7c50: 6f 20 73 65 74 20 6c 6f 63 6b 20 70 72 6f 78 79  o set lock proxy
7c60: 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20   file");.       
7c70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
7c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7c90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
7ca0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7cb0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
7cc0: 54 59 4c 45 20 2a 2f 20 20 20 20 20 20 0a 20 20  TYLE */      .  
7cd0: 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50    .  /*.  **   P
7ce0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
7cf0: 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20  ynchronous.  ** 
7d00: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7d10: 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  .]synchronous=OF
7d20: 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c  F|ON|NORMAL|FULL
7d30: 7c 45 58 54 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a  |EXTRA.  **.  **
7d40: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7d50: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7d60: 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75  f the synchronou
7d70: 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  s flag.  Changin
7d80: 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  g.  ** the local
7d90: 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
7da0: 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  make changes to 
7db0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e  the disk file an
7dc0: 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  d the.  ** defau
7dd0: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
7de0: 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65   restored the ne
7df0: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
7e00: 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65  base is.  ** ope
7e10: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
7e20: 20 50 72 61 67 54 79 70 5f 53 59 4e 43 48 52 4f   PragTyp_SYNCHRO
7e30: 4e 4f 55 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  NOUS: {.    if( 
7e40: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
7e50: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
7e60: 28 76 2c 20 70 44 62 2d 3e 73 61 66 65 74 79 5f  (v, pDb->safety_
7e70: 6c 65 76 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65  level-1);.    }e
7e80: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
7e90: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
7ea0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7eb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7ec0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
7ed0: 53 61 66 65 74 79 20 6c 65 76 65 6c 20 6d 61 79  Safety level may
7ee0: 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20   not be changed 
7ef0: 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61 63  inside a transac
7f00: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65  tion");.      }e
7f10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7f20: 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53 61   iLevel = (getSa
7f30: 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74  fetyLevel(zRight
7f40: 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45 52  ,0,1)+1) & PAGER
7f50: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
7f60: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  K;.        if( i
7f70: 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76 65  Level==0 ) iLeve
7f80: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  l = 1;.        p
7f90: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
7fa0: 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 20   = iLevel;.     
7fb0: 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74     pDb->bSyncSet
7fc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65   = 1;.        se
7fd0: 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64  tAllPagerFlags(d
7fe0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
7ff0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
8000: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8010: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
8020: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
8030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41   SQLITE_OMIT_FLA
8040: 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65  G_PRAGMAS.  case
8050: 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20 7b   PragTyp_FLAG: {
8060: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
8070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 50  =0 ){.      setP
8080: 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d  ragmaResultColum
8090: 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67 6d  nNames(v, pPragm
80a0: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
80b0: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64 62  SingleInt(v, (db
80c0: 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61 67 6d  ->flags & pPragm
80d0: 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a 20  a->iArg)!=0 );. 
80e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
80f0: 69 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72 61 67  int mask = pPrag
8100: 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a 20  ma->iArg;    /* 
8110: 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 6f 20  Mask of bits to 
8120: 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a 2f  set or clear. */
8130: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
8140: 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
8150: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 69          /* Forei
8160: 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20 6d  gn key support m
8170: 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c 65  ay not be enable
8180: 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77 68  d or disabled wh
8190: 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  ile not.        
81a0: 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ** in auto-commi
81b0: 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20 20  t mode.  */.    
81c0: 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51      mask &= ~(SQ
81d0: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
81e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53  );.      }.#if S
81f0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
8200: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20  NTICATION.      
8210: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
8220: 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55 73  hLevel==UAUTH_Us
8230: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  er ){.        /*
8240: 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e 6f   Do not allow no
8250: 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20 74 6f  n-admin users to
8260: 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65   modify the sche
8270: 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79 20 2a  ma arbitrarily *
8280: 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26  /.        mask &
8290: 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69 74 65  = ~(SQLITE_Write
82a0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d  Schema);.      }
82b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
82c0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
82d0: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20  lean(zRight, 0) 
82e0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66  ){.        db->f
82f0: 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
8300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8310: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
8320: 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 69  ~mask;.        i
8330: 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45 5f  f( mask==SQLITE_
8340: 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d 3e 6e  DeferFKs ) db->n
8350: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
8360: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
8370: 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20 74      /* Many of t
8380: 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61 73 20  he flag-pragmas 
8390: 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64 65 20  modify the code 
83a0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
83b0: 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20 63   SQL .      ** c
83c0: 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63 6f 75  ompiler (eg. cou
83d0: 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f 20  nt_changes). So 
83e0: 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 6f  add an opcode to
83f0: 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20 20 20   expire all.    
8400: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53 51    ** compiled SQ
8410: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 66 74  L statements aft
8420: 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 70  er modifying a p
8430: 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20 20  ragma value..   
8440: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
8450: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
8460: 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
8470: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8480: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  ags(db);.    }. 
8490: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
84a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
84b0: 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53  MIT_FLAG_PRAGMAS
84c0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
84d0: 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f  ITE_OMIT_SCHEMA_
84e0: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
84f0: 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65  *   PRAGMA table
8500: 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a 20  _info(<table>). 
8510: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
8520: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f 72  a single row for
8530: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
8540: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
8550: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   The columns of.
8560: 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65    ** the returne
8570: 64 20 64 61 74 61 20 73 65 74 20 61 72 65 3a 0a  d data set are:.
8580: 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20 20    **.  ** cid:  
8590: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64 20        Column id 
85a0: 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c  (numbered from l
85b0: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 73 74  eft to right, st
85c0: 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20 20 2a  arting at 0).  *
85d0: 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 43 6f  * name:       Co
85e0: 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20 74  lumn name.  ** t
85f0: 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d  ype:       Colum
8600: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  n declaration ty
8610: 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c  pe..  ** notnull
8620: 3a 20 20 20 20 54 72 75 65 20 69 66 20 27 4e 4f  :    True if 'NO
8630: 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72 74 20  T NULL' is part 
8640: 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  of column declar
8650: 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f  ation.  ** dflt_
8660: 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66 61 75  value: The defau
8670: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
8680: 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e   column, if any.
8690: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
86a0: 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a  gTyp_TABLE_INFO:
86b0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
86c0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
86d0: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
86e0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
86f0: 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45  arse, LOCATE_NOE
8700: 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29  RR, zRight, zDb)
8710: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
8720: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b  {.      int i, k
8730: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64  ;.      int nHid
8740: 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43  den = 0;.      C
8750: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20  olumn *pCol;.   
8760: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
8770: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
8780: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
8790: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
87a0: 20 3d 20 36 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 6;.      sqli
87b0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
87c0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
87d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
87e0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
87f0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  s(pParse, pTab);
8800: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
8810: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
8820: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
8830: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
8840: 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
8850: 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29 7b  nColumn(pCol) ){
8860: 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64  .          nHidd
8870: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
8880: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8890: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
88a0: 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  (pCol->colFlags 
88b0: 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
88c0: 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
88d0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20     k = 0;.      
88e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d    }else if( pPk=
88f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8900: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  k = 1;.        }
8910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8920: 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62  for(k=1; k<=pTab
8930: 2d 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61  ->nCol && pPk->a
8940: 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b  iColumn[k-1]!=i;
8950: 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   k++){}.        
8960: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
8970: 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30  ( pCol->pDflt==0
8980: 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d   || pCol->pDflt-
8990: 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a  >op==TK_SPAN );.
89a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
89b0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
89c0: 31 2c 20 22 69 73 73 69 73 69 22 2c 0a 20 20 20  1, "issisi",.   
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2d 6e 48              i-nH
89e0: 69 64 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  idden,.         
89f0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
8a00: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
8a10: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54    sqlite3ColumnT
8a20: 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20  ype(pCol,""),.  
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
8a40: 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a  l->notNull ? 1 :
8a50: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
8a60: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f     pCol->pDflt ?
8a70: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e   pCol->pDflt->u.
8a80: 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20  zToken : 0,.    
8a90: 20 20 20 20 20 20 20 20 20 20 20 6b 29 3b 0a 20             k);. 
8aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8ab0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
8ac0: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 36 29 3b  esultRow, 1, 6);
8ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8ae0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63   }.  break;..  c
8af0: 61 73 65 20 50 72 61 67 54 79 70 5f 53 54 41 54  ase PragTyp_STAT
8b00: 53 3a 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  S: {.    Index *
8b10: 70 49 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c  pIdx;.    HashEl
8b20: 65 6d 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73  em *i;.    pPars
8b30: 65 2d 3e 6e 4d 65 6d 20 3d 20 34 3b 0a 20 20 20  e->nMem = 4;.   
8b40: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8b50: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8b60: 20 69 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69   iDb);.    for(i
8b70: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
8b80: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
8b90: 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  tblHash); i; i=s
8ba0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
8bb0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
8bc0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
8bd0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20  hData(i);.      
8be0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
8bf0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69  Load(v, 1, "ssii
8c00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
8c10: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
8c20: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
8c30: 20 20 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52      pTab->szTabR
8c40: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
8c50: 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 29  Tab->nRowLogEst)
8c60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8c70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8c80: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 34 29  ResultRow, 1, 4)
8c90: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ;.      for(pIdx
8ca0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
8cb0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
8cc0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
8cd0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
8ce0: 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73 69 69 22  Load(v, 2, "sii"
8cf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
8d00: 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
8d10: 20 20 20 20 20 70 49 64 78 2d 3e 73 7a 49 64 78       pIdx->szIdx
8d20: 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
8d30: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
8d40: 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  t[0]);.        s
8d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8d60: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
8d70: 2c 20 31 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  , 1, 4);.      }
8d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
8d90: 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67  ak;..  case Prag
8da0: 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20  Typ_INDEX_INFO: 
8db0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
8dc0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8dd0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8de0: 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74      pIdx = sqlit
8df0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
8e00: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
8e10: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
8e20: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
8e30: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
8e40: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
8e50: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
8e60: 26 26 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  && !HasRowid(pTa
8e70: 62 29 20 29 20 70 49 64 78 20 3d 20 73 71 6c 69  b) ) pIdx = sqli
8e80: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
8e90: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  ex(pTab);.    }.
8ea0: 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
8eb0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
8ec0: 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20     int mx;.     
8ed0: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
8ee0: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rg ){.        /*
8ef0: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69   PRAGMA index_xi
8f00: 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69  nfo (newer versi
8f10: 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77  on with more row
8f20: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a  s and columns) *
8f30: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
8f40: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
8f50: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
8f60: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65  em = 6;.      }e
8f70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
8f80: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66  PRAGMA index_inf
8f90: 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f  o (legacy versio
8fa0: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  n) */.        mx
8fb0: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
8fc0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8fd0: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
8fe0: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d    }.      pTab =
8ff0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
9000: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9010: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9020: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9030: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
9040: 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e  >nMem<=pPragma->
9050: 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20 20  nPragCName );.  
9060: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d      for(i=0; i<m
9070: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
9080: 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49 64 78   i16 cnum = pIdx
9090: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
90a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
90b0: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
90c0: 2c 20 22 69 69 73 22 2c 20 69 2c 20 63 6e 75 6d  , "iis", i, cnum
90d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
90f0: 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54 61 62  num<0 ? 0 : pTab
9100: 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61  ->aCol[cnum].zNa
9110: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
9120: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29   pPragma->iArg )
9130: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9140: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9150: 28 76 2c 20 34 2c 20 22 69 73 69 22 2c 0a 20 20  (v, 4, "isi",.  
9160: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9170: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2c 0a 20  aSortOrder[i],. 
9180: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9190: 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20  >azColl[i],.    
91a0: 20 20 20 20 20 20 20 20 69 3c 70 49 64 78 2d 3e          i<pIdx->
91b0: 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20  nKeyCol);.      
91c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
91d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
91e0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
91f0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  , pParse->nMem);
9200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9210: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63   }.  break;..  c
9220: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9230: 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67  X_LIST: if( zRig
9240: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
9250: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
9260: 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20   *pTab;.    int 
9270: 69 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  i;.    pTab = sq
9280: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
9290: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
92a0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
92b0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
92c0: 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20 73  Mem = 5;.      s
92d0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
92e0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
92f0: 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  Db);.      for(p
9300: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
9310: 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20 70 49 64  , i=0; pIdx; pId
9320: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69  x=pIdx->pNext, i
9330: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
9340: 73 74 20 63 68 61 72 20 2a 61 7a 4f 72 69 67 69  st char *azOrigi
9350: 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20 22 75 22  n[] = { "c", "u"
9360: 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20 20 20 20  , "pk" };.      
9370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9380: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73  tiLoad(v, 1, "is
9390: 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20  isi",.          
93a0: 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   i,.           p
93b0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Idx->zName,.    
93c0: 20 20 20 20 20 20 20 49 73 55 6e 69 71 75 65 49         IsUniqueI
93d0: 6e 64 65 78 28 70 49 64 78 29 2c 0a 20 20 20 20  ndex(pIdx),.    
93e0: 20 20 20 20 20 20 20 61 7a 4f 72 69 67 69 6e 5b         azOrigin[
93f0: 70 49 64 78 2d 3e 69 64 78 54 79 70 65 5d 2c 0a  pIdx->idxType],.
9400: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9410: 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
9420: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
9430: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9440: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
9450: 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 5);.      }.  
9460: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9470: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9480: 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a 20  _DATABASE_LIST: 
9490: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
94a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
94b0: 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  3;.    for(i=0; 
94c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
94d0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
94e0: 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63  Db[i].pBt==0 ) c
94f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
9500: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
9510: 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29 3b  ].zDbSName!=0 );
9520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9530: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9540: 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20 20  , "iss",.       
9550: 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64 62    i,.         db
9560: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
9570: 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  e,.         sqli
9580: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
9590: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ame(db->aDb[i].p
95a0: 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Bt));.      sqli
95b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
95c0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
95d0: 2c 20 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 3);.    }.  }.
95e0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
95f0: 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54 49   PragTyp_COLLATI
9600: 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69  ON_LIST: {.    i
9610: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48 61  nt i = 0;.    Ha
9620: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 70  shElem *p;.    p
9630: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b  Parse->nMem = 2;
9640: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
9650: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9660: 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d  aCollSeq); p; p=
9670: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
9680: 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  )){.      CollSe
9690: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
96a0: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
96b0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 73  Data(p);.      s
96c0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
96d0: 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c 20  oad(v, 1, "is", 
96e0: 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  i++, pColl->zNam
96f0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9700: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9710: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
9720: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2);.    }.  }.  
9730: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
9740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
9750: 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  EMA_PRAGMAS */..
9760: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9770: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
9780: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46    case PragTyp_F
9790: 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a  OREIGN_KEY_LIST:
97a0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
97b0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20     FKey *pFK;.  
97c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
97d0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
97e0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
97f0: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
9800: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
9810: 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70     pFK = pTab->p
9820: 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20  FKey;.      if( 
9830: 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pFK ){.        i
9840: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
9850: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9860: 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 8;.        sql
9870: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
9880: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
9890: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
98a0: 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20 20 20  (pFK){.         
98b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
98c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b    for(j=0; j<pFK
98d0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
98e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
98f0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9900: 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73 22 2c  , 1, "iissssss",
9910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9920: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9930: 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20 20 20            j,.   
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9950: 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20 20  pFK->zTo,.      
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
9970: 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f  b->aCol[pFK->aCo
9980: 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d  l[j].iFrom].zNam
9990: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
99a0: 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b        pFK->aCol[
99b0: 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20 20  j].zCol,.       
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69              acti
99d0: 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74  onName(pFK->aAct
99e0: 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20  ion[1]),  /* ON 
99f0: 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 20 20  UPDATE */.      
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74               act
9a10: 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63  ionName(pFK->aAc
9a20: 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e  tion[0]),  /* ON
9a30: 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 20   DELETE */.     
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
9a50: 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ONE");.         
9a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9a70: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9a80: 74 52 6f 77 2c 20 31 2c 20 38 29 3b 0a 20 20 20  tRow, 1, 8);.   
9a90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9aa0: 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20     ++i;.        
9ab0: 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65    pFK = pFK->pNe
9ac0: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20  xtFrom;.        
9ad0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
9ae0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9af0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
9b00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
9b10: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66  IGN_KEY) */..#if
9b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9b30: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 23 69 66  _FOREIGN_KEY.#if
9b40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9b50: 5f 54 52 49 47 47 45 52 0a 20 20 63 61 73 65 20  _TRIGGER.  case 
9b60: 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f  PragTyp_FOREIGN_
9b70: 4b 45 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20  KEY_CHECK: {.   
9b80: 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20 20 20 20   FKey *pFK;     
9b90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 6f 72          /* A for
9ba0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
9bb0: 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  int */.    Table
9bc0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
9bd0: 20 20 2f 2a 20 43 68 69 6c 64 20 74 61 62 6c 65    /* Child table
9be0: 20 63 6f 6e 74 61 69 6e 20 22 52 45 46 45 52 45   contain "REFERE
9bf0: 4e 43 45 53 22 20 6b 65 79 77 6f 72 64 20 2a 2f  NCES" keyword */
9c00: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 50 61 72  .    Table *pPar
9c10: 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  ent;        /* P
9c20: 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  arent table that
9c30: 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 74 6f   child points to
9c40: 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
9c50: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
9c60: 2a 20 49 6e 64 65 78 20 69 6e 20 74 68 65 20 70  * Index in the p
9c70: 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  arent table */. 
9c80: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
9c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9ca0: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 6f 72 65  p counter:  Fore
9cb0: 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65 72 20 66  ign key number f
9cc0: 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69  or pTab */.    i
9cd0: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
9ce0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9cf0: 75 6e 74 65 72 3a 20 20 46 69 65 6c 64 20 6f 66  unter:  Field of
9d00: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
9d10: 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   */.    HashElem
9d20: 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f   *k;           /
9d30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20  * Loop counter: 
9d40: 20 4e 65 78 74 20 74 61 62 6c 65 20 69 6e 20 73   Next table in s
9d50: 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74  chema */.    int
9d60: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
9d70: 20 20 20 20 2f 2a 20 72 65 73 75 6c 74 20 76 61      /* result va
9d80: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
9d90: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
9da0: 20 20 20 20 20 2f 2a 20 33 20 72 65 67 69 73 74       /* 3 regist
9db0: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 65  ers to hold a re
9dc0: 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
9dd0: 69 6e 74 20 72 65 67 4b 65 79 3b 20 20 20 20 20  int regKey;     
9de0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
9df0: 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65 79 20 66  er to hold key f
9e00: 6f 72 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  or checking the 
9e10: 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  FK */.    int re
9e20: 67 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  gRow;           
9e30: 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
9e40: 20 68 6f 6c 64 20 61 20 72 6f 77 20 66 72 6f 6d   hold a row from
9e50: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74   pTab */.    int
9e60: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
9e70: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 61 20      /* Top of a 
9e80: 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67 20 66 6f  loop checking fo
9e90: 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f 0a 20 20  reign keys */.  
9ea0: 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b 20 20 20    int addrOk;   
9eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
9ec0: 20 68 65 72 65 20 69 66 20 74 68 65 20 6b 65 79   here if the key
9ed0: 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e   is OK */.    in
9ee0: 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20 20 20 20  t *aiCols;      
9ef0: 20 20 20 20 20 2f 2a 20 63 68 69 6c 64 20 74 6f       /* child to
9f00: 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d   parent column m
9f10: 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  apping */..    r
9f20: 65 67 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73  egResult = pPars
9f30: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
9f40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34  Parse->nMem += 4
9f50: 3b 0a 20 20 20 20 72 65 67 4b 65 79 20 3d 20 2b  ;.    regKey = +
9f60: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
9f70: 20 20 20 72 65 67 52 6f 77 20 3d 20 2b 2b 70 50     regRow = ++pP
9f80: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
9f90: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
9fa0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
9fb0: 69 44 62 29 3b 0a 20 20 20 20 6b 20 3d 20 73 71  iDb);.    k = sq
9fc0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
9fd0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
9fe0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 0a 20  ema->tblHash);. 
9ff0: 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b 0a 20     while( k ){. 
a000: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20       if( zRight 
a010: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
a020: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
a030: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
a040: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
a050: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
a060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a070: 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
a080: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
a090: 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  k);.        k = 
a0a0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
a0b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a0c0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
a0d0: 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d 30 20 29  pTab->pFKey==0 )
a0e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a0f0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
a100: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
a110: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
a120: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a130: 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c    if( pTab->nCol
a140: 2b 72 65 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e  +regRow>pParse->
a150: 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e  nMem ) pParse->n
a160: 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Mem = pTab->nCol
a170: 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20 20 20 20   + regRow;.     
a180: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
a190: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  e(pParse, 0, iDb
a1a0: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
a1b0: 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ead);.      sqli
a1c0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
a1d0: 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  g(v, regResult, 
a1e0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
a1f0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
a200: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
a210: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
a220: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
a230: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
a240: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
a250: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
a260: 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
a270: 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f 6e  pParent==0 ) con
a280: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
a290: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
a2a0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
a2b0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
a2c0: 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c  Parent->tnum, 0,
a2d0: 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29   pParent->zName)
a2e0: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 73 71  ;.        x = sq
a2f0: 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64  lite3FkLocateInd
a300: 65 78 28 70 50 61 72 73 65 2c 20 70 50 61 72 65  ex(pParse, pPare
a310: 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c 20  nt, pFK, &pIdx, 
a320: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a330: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
a340: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
a350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a360: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
a370: 61 72 73 65 2c 20 69 2c 20 69 44 62 2c 20 70 50  arse, i, iDb, pP
a380: 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65  arent, OP_OpenRe
a390: 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ad);.          }
a3a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a3c0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
a3d0: 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75  ad, i, pIdx->tnu
a3e0: 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
a3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a400: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
a410: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
a420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a440: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
a450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a460: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a470: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
a480: 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d  >nErr>0 || pFK==
a490: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
a4a0: 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  FK ) break;.    
a4b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
a4c0: 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d 3e 6e  ab<i ) pParse->n
a4d0: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 61  Tab = i;.      a
a4e0: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
a4f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
a500: 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56 64 62  _Rewind, 0); Vdb
a510: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a520: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
a530: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
a540: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
a550: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
a560: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
a570: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
a580: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
a590: 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  b);.        pIdx
a5a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 69   = 0;.        ai
a5b0: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cols = 0;.      
a5c0: 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
a5e0: 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e  qlite3FkLocateIn
a5f0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 50 61 72  dex(pParse, pPar
a600: 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c  ent, pFK, &pIdx,
a610: 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20   &aiCols);.     
a620: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d       assert( x==
a630: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  0 );.        }. 
a640: 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20 3d 20         addrOk = 
a650: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
a660: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
a670: 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
a680: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
a690: 20 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20       int iKey = 
a6a0: 70 46 4b 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  pFK->aCol[0].iFr
a6b0: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  om;.          as
a6c0: 73 65 72 74 28 20 69 4b 65 79 3e 3d 30 20 26 26  sert( iKey>=0 &&
a6d0: 20 69 4b 65 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iKey<pTab->nCol
a6e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
a6f0: 28 20 69 4b 65 79 21 3d 70 54 61 62 2d 3e 69 50  ( iKey!=pTab->iP
a700: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
a710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a720: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
a730: 6e 2c 20 30 2c 20 69 4b 65 79 2c 20 72 65 67 52  n, 0, iKey, regR
a740: 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ow);.           
a750: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
a760: 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
a770: 4b 65 79 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  Key, regRow);.  
a780: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a790: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a7a0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  P_IsNull, regRow
a7b0: 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43  , addrOk); VdbeC
a7c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a7d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a7e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a7f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a800: 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 6f  _Rowid, 0, regRo
a810: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  w);.          }.
a820: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a830: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a840: 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 2c 20  P_SeekRowid, i, 
a850: 30 2c 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65  0, regRow); Vdbe
a860: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a870: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a880: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b  beGoto(v, addrOk
a890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
a8a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a8b0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
a8c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
a8d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a8e0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
a8f0: 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b  =0; j<pFK->nCol;
a900: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
a910: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a920: 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
a930: 6c 65 28 76 2c 20 70 54 61 62 2c 20 30 2c 0a 20  le(v, pTab, 0,. 
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 20 20 20 20 20 20 20 61 69 43 6f 6c             aiCol
a960: 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20  s ? aiCols[j] : 
a970: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
a980: 6f 6d 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20  om, regRow+j);. 
a990: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a9a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a9b0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f  OP_IsNull, regRo
a9c0: 77 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64  w+j, addrOk); Vd
a9d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a9e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a9f0: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
aa00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aa10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aa20: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
aa30: 72 64 2c 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d  rd, regRow, pFK-
aa40: 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20  >nCol, regKey,. 
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
aa70: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
aa80: 79 53 74 72 28 64 62 2c 70 49 64 78 29 2c 20 70  yStr(db,pIdx), p
aa90: 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  FK->nCol);.     
aaa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aab0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
aac0: 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64 72  P_Found, i, addr
aad0: 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a  Ok, regKey, 0);.
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
aaf0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
ab00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ab10: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
ab20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ab30: 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  OP_Rowid, 0, reg
ab40: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
ab50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
ab60: 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67 52 65  ltiLoad(v, regRe
ab70: 73 75 6c 74 2b 32 2c 20 22 73 69 22 2c 20 70 46  sult+2, "si", pF
ab80: 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20 20  K->zTo, i-1);.  
ab90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aba0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
abb0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
abc0: 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  lt, 4);.        
abd0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
abe0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
abf0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ac00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 69  te3DbFree(db, ai
ac10: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cols);.      }. 
ac20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
ac40: 74 2c 20 30 2c 20 61 64 64 72 54 6f 70 2b 31 29  t, 0, addrTop+1)
ac50: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
ac60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ac70: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ac80: 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d 0a  addrTop);.    }.
ac90: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
aca0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
acb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
acc0: 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  GER) */.#endif /
acd0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
ace0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
acf0: 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EY) */..#ifndef 
ad00: 4e 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72  NDEBUG.  case Pr
ad10: 61 67 54 79 70 5f 50 41 52 53 45 52 5f 54 52 41  agTyp_PARSER_TRA
ad20: 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  CE: {.    if( zR
ad30: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66  ight ){.      if
ad40: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
ad50: 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29  ean(zRight, 0) )
ad60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ad70: 33 50 61 72 73 65 72 54 72 61 63 65 28 73 74 64  3ParserTrace(std
ad80: 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29  out, "parser: ")
ad90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ada0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
adb0: 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b  rserTrace(0, 0);
adc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
add0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
ade0: 69 66 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61  if..  /* Reinsta
adf0: 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20  ll the LIKE and 
ae00: 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20  GLOB functions. 
ae10: 20 54 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20   The variant of 
ae20: 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77  LIKE.  ** used w
ae30: 69 6c 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73  ill be case sens
ae40: 69 74 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70  itive or not dep
ae50: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48  ending on the RH
ae60: 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  S..  */.  case P
ae70: 72 61 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53  ragTyp_CASE_SENS
ae80: 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20  ITIVE_LIKE: {.  
ae90: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
aea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 67        sqlite3Reg
aeb0: 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f  isterLikeFunctio
aec0: 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65  ns(db, sqlite3Ge
aed0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
aee0: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   0));.    }.  }.
aef0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20    break;..  /*. 
af00: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 73 74   **   PRAGMA est
af10: 5f 72 6f 77 5f 63 6e 74 28 3c 74 61 62 6c 65 2d  _row_cnt(<table-
af20: 6f 72 2d 69 6e 64 65 78 3e 2c 3c 66 72 61 63 74  or-index>,<fract
af30: 69 6f 6e 3e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  ion>);.  **.  **
af40: 20 53 65 65 6b 20 69 6e 20 3c 74 61 62 6c 65 2d   Seek in <table-
af50: 6f 72 2d 69 6e 64 65 78 3e 20 74 68 72 6f 75 67  or-index> throug
af60: 68 20 74 68 65 20 66 69 72 73 74 20 3c 66 72 61  h the first <fra
af70: 63 74 69 6f 6e 3e 20 6f 66 20 72 6f 77 73 20 61  ction> of rows a
af80: 6e 64 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65  nd.  ** estimate
af90: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
afa0: 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65 64 20  r of rows based 
afb0: 6f 6e 20 74 68 65 20 70 61 74 68 20 62 61 63 6b  on the path back
afc0: 20 75 70 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20   up to the.  ** 
afd0: 72 6f 6f 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  root..  */.  cas
afe0: 65 20 50 72 61 67 54 79 70 5f 45 53 54 5f 43 4f  e PragTyp_EST_CO
aff0: 55 4e 54 3a 20 7b 0a 20 20 20 20 49 6e 64 65 78  UNT: {.    Index
b000: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
b010: 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  e *pTab = 0;.   
b020: 20 50 67 6e 6f 20 69 52 6f 6f 74 20 3d 20 30 3b   Pgno iRoot = 0;
b030: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b040: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
b050: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 0a 20  int regResult;. 
b060: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
b070: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
b080: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
b090: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 29 21  , zRight, zDb))!
b0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 6f  =0 ){.      iRoo
b0b0: 74 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  t = pIdx->tnum;.
b0c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 49        zName = pI
b0d0: 64 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  dx->zName;.    }
b0e0: 65 6c 73 65 20 69 66 28 20 28 70 54 61 62 20 3d  else if( (pTab =
b0f0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
b100: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
b110: 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))!=0 ){.      
b120: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  zName = pTab->zN
b130: 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 48  ame;.      if( H
b140: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
b150: 0a 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d  .        iRoot =
b160: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pTab->tnum;.   
b170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b180: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
b190: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
b1a0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 69  pTab);.        i
b1b0: 52 6f 6f 74 20 3d 20 70 49 64 78 2d 3e 74 6e 75  Root = pIdx->tnu
b1c0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
b1d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
b1e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
b1f0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
b200: 61 72 73 65 2c 20 69 44 62 2c 20 69 52 6f 6f 74  arse, iDb, iRoot
b210: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  , 0, zName);.   
b220: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70   regResult = ++p
b230: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
b240: 20 69 66 28 20 70 56 61 6c 75 65 73 2d 3e 6e 49   if( pValues->nI
b250: 64 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 6f  d>=2 ){.      co
b260: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 56  nst char *z = pV
b270: 61 6c 75 65 73 2d 3e 61 5b 31 5d 2e 7a 4e 61 6d  alues->a[1].zNam
b280: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
b290: 41 74 6f 46 28 7a 2c 20 26 72 2c 20 73 71 6c 69  AtoF(z, &r, sqli
b2a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
b2b0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
b2c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
b2d0: 20 3d 20 30 2e 35 3b 0a 20 20 20 20 7d 0a 20 20   = 0.5;.    }.  
b2e0: 20 20 69 66 28 20 72 3c 30 2e 30 20 29 20 72 20    if( r<0.0 ) r 
b2f0: 3d 20 30 2e 30 3b 0a 20 20 20 20 69 66 28 20 72  = 0.0;.    if( r
b300: 3e 31 2e 30 20 29 20 72 20 3d 20 31 2e 30 3b 0a  >1.0 ) r = 1.0;.
b310: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
b320: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
b330: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 70 50  se, iDb);.    pP
b340: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
b350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b360: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
b370: 6e 52 65 61 64 2c 20 30 2c 20 69 52 6f 6f 74 2c  nRead, 0, iRoot,
b380: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 69 66   iDb, 1);.    if
b390: 28 20 70 49 64 78 20 29 20 73 71 6c 69 74 65 33  ( pIdx ) sqlite3
b3a0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
b3b0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
b3c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 73 74 52  ddOp3(v, OP_EstR
b3e0: 6f 77 43 6e 74 2c 20 30 2c 20 72 65 67 52 65 73  owCnt, 0, regRes
b3f0: 75 6c 74 2c 20 28 69 6e 74 29 28 72 2a 31 30 30  ult, (int)(r*100
b400: 30 30 30 30 30 30 30 29 29 3b 0a 20 20 20 20 73  0000000));.    s
b410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b420: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
b430: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  , regResult, 1);
b440: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
b450: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
b460: 41 20 62 74 72 65 65 5f 73 61 6d 70 6c 65 28 3c  A btree_sample(<
b470: 74 61 62 6c 65 2d 6f 72 2d 69 6e 64 65 78 3e 2c  table-or-index>,
b480: 3c 66 72 61 63 74 69 6f 6e 3e 2c 3c 6c 69 6d 69  <fraction>,<limi
b490: 74 3e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  t>);.  **.  ** S
b4a0: 65 65 6b 20 69 6e 20 3c 74 61 62 6c 65 2d 6f 72  eek in <table-or
b4b0: 2d 69 6e 64 65 78 3e 20 74 68 72 6f 75 67 68 20  -index> through 
b4c0: 74 68 65 20 66 69 72 73 74 20 3c 66 72 61 63 74  the first <fract
b4d0: 69 6f 6e 3e 20 6f 66 20 72 6f 77 73 20 61 6e 64  ion> of rows and
b4e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 62 65 67 69 6e  .  ** then begin
b4f0: 20 72 65 74 75 72 6e 69 6e 67 20 72 6f 77 73 2c   returning rows,
b500: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 20 20 41 20   one by one.  A 
b510: 6d 61 78 20 6f 66 20 3c 6c 69 6d 69 74 3e 20 72  max of <limit> r
b520: 6f 77 73 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ows will.  ** be
b530: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
b540: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 42    case PragTyp_B
b550: 54 52 45 45 5f 53 41 4d 50 4c 45 3a 20 7b 0a 20  TREE_SAMPLE: {. 
b560: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
b570: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b580: 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 52  = 0;.    Pgno iR
b590: 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e  oot = 0;.    Pgn
b5a0: 6f 20 69 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  o iLock = 0;.   
b5b0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
b5c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b5d0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Name = 0;.    in
b5e0: 74 20 69 4c 69 6d 69 74 20 3d 20 31 30 3b 0a 20  t iLimit = 10;. 
b5f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
b600: 74 20 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20  t regResult;.   
b610: 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 3b 0a 20   int regLimit;. 
b620: 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a     int addrTop;.
b630: 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b      int addrJmp;
b640: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6b 69  .    int addrSki
b650: 70 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  p;.    double r;
b660: 0a 20 20 20 20 69 66 28 20 28 70 49 64 78 20 3d  .    if( (pIdx =
b670: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
b680: 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  x(db, zRight, zD
b690: 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))!=0 ){.      
b6a0: 69 52 6f 6f 74 20 3d 20 70 49 64 78 2d 3e 74 6e  iRoot = pIdx->tn
b6b0: 75 6d 3b 0a 20 20 20 20 20 20 69 4c 6f 63 6b 20  um;.      iLock 
b6c0: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
b6d0: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7a 4e 61 6d  tnum;.      zNam
b6e0: 65 20 3d 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3b  e = pIdx->zName;
b6f0: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  .      nCol = pI
b700: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
b710: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61 62   }else if( (pTab
b720: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
b730: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
b740: 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  zDb))!=0 ){.    
b750: 20 20 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e    zName = pTab->
b760: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
b770: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
b780: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 63 6b  ){.        iLock
b790: 20 3d 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d   = iRoot = pTab-
b7a0: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 6e  >tnum;.        n
b7b0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
b7c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b7d0: 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 73 71         pIdx = sq
b7e0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
b7f0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
b800: 20 20 20 20 69 4c 6f 63 6b 20 3d 20 69 52 6f 6f      iLock = iRoo
b810: 74 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  t = pIdx->tnum;.
b820: 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
b830: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
b840: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
b850: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b860: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b870: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
b880: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28   nCol);.    for(
b890: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
b8a0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 43  ){.      char zC
b8b0: 6f 6c 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 71  ol[30];.      sq
b8c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
b8d0: 69 7a 65 6f 66 28 7a 43 6f 6c 29 2c 7a 43 6f 6c  izeof(zCol),zCol
b8e0: 2c 22 63 25 30 36 64 22 2c 69 29 3b 0a 20 20 20  ,"c%06d",i);.   
b8f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b900: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b910: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
b920: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
b930: 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ENT);.    }.    
b940: 69 66 28 20 70 56 61 6c 75 65 73 2d 3e 6e 49 64  if( pValues->nId
b950: 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  >=2 ){.      con
b960: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 56 61  st char *z = pVa
b970: 6c 75 65 73 2d 3e 61 5b 31 5d 2e 7a 4e 61 6d 65  lues->a[1].zName
b980: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  ;.      sqlite3A
b990: 74 6f 46 28 7a 2c 20 26 72 2c 20 73 71 6c 69 74  toF(z, &r, sqlit
b9a0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
b9b0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
b9c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 20   }else{.      r 
b9d0: 3d 20 30 2e 35 3b 0a 20 20 20 20 7d 0a 20 20 20  = 0.5;.    }.   
b9e0: 20 69 66 28 20 72 3c 30 2e 30 20 29 20 72 20 3d   if( r<0.0 ) r =
b9f0: 20 30 2e 30 3b 0a 20 20 20 20 69 66 28 20 72 3e   0.0;.    if( r>
ba00: 31 2e 30 20 29 20 72 20 3d 20 31 2e 30 3b 0a 20  1.0 ) r = 1.0;. 
ba10: 20 20 20 69 66 28 20 70 56 61 6c 75 65 73 2d 3e     if( pValues->
ba20: 6e 49 64 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  nId>=3 ){.      
ba30: 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  iLimit = sqlite3
ba40: 41 74 6f 69 28 70 56 61 6c 75 65 73 2d 3e 61 5b  Atoi(pValues->a[
ba50: 32 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  2].zName);.    }
ba60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
ba70: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
ba80: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
ba90: 2c 20 69 44 62 2c 20 69 4c 6f 63 6b 2c 20 30 2c  , iDb, iLock, 0,
baa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c   zName);.    sql
bab0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
bac0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
bad0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
bae0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
baf0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 20 69  P_OpenRead, 0, i
bb00: 52 6f 6f 74 2c 20 69 44 62 2c 20 6e 43 6f 6c 29  Root, iDb, nCol)
bb10: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29  ;.    if( pIdx )
bb20: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
bb30: 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
bb40: 20 70 49 64 78 29 3b 0a 20 20 20 20 72 65 67 4c   pIdx);.    regL
bb50: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
bb60: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 65  >nMem;.    regRe
bb70: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
bb80: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
bb90: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 43 6f 6c 3b  e->nMem += nCol;
bba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bbb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bbc0: 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 72 65  eger, iLimit, re
bbd0: 67 4c 69 6d 69 74 29 3b 0a 20 20 20 20 61 64 64  gLimit);.    add
bbe0: 72 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56  rSkip = sqlite3V
bbf0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
bc00: 52 65 77 69 6e 64 2c 20 30 29 3b 20 56 64 62 65  Rewind, 0); Vdbe
bc10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
bc20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bc30: 70 33 28 76 2c 20 4f 50 5f 45 73 74 52 6f 77 43  p3(v, OP_EstRowC
bc40: 6e 74 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74  nt, 0, regResult
bc50: 2c 20 28 69 6e 74 29 28 72 2a 31 30 30 30 30 30  , (int)(r*100000
bc60: 30 30 30 30 29 29 3b 0a 20 20 20 20 61 64 64 72  0000));.    addr
bc70: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
bc80: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
bc90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bca0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
bcb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bcc0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
bcd0: 2c 20 30 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  , 0, i, regResul
bce0: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t+i);.    }.    
bcf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bd00: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
bd10: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  w, regResult, nC
bd20: 6f 6c 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70  ol);.    addrJmp
bd30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bd40: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp1(v, OP_DecrJ
bd50: 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  umpZero, regLimi
bd60: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
bd70: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
bd80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bd90: 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f  _Next, 0, addrTo
bda0: 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  p); VdbeCoverage
bdb0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
bdc0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bdd0: 61 64 64 72 4a 6d 70 29 3b 0a 20 20 20 20 73 71  addrJmp);.    sq
bde0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
bdf0: 65 28 76 2c 20 61 64 64 72 53 6b 69 70 29 3b 0a  e(v, addrSkip);.
be00: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69    }.  break;..#i
be10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54  fndef SQLITE_INT
be20: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
be30: 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20  OR_MAX.# define 
be40: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
be50: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
be60: 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66   100.#endif..#if
be70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
be80: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
be90: 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20 22 71 75  .  /* Pragma "qu
bea0: 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65  ick_check" is re
beb0: 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  duced version of
bec0: 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79   .  ** integrity
bed0: 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20  _check designed 
bee0: 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64  to detect most d
bef0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
bf00: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  on.  ** without 
bf10: 6d 6f 73 74 20 6f 66 20 74 68 65 20 6f 76 65 72  most of the over
bf20: 68 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 69  head of a full i
bf30: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a  ntegrity-check..
bf40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
bf50: 54 79 70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  Typ_INTEGRITY_CH
bf60: 45 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ECK: {.    int i
bf70: 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72 72  , j, addr, mxErr
bf80: 3b 0a 0a 20 20 20 20 69 6e 74 20 69 73 51 75 69  ;..    int isQui
bf90: 63 6b 20 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c  ck = (sqlite3Tol
bfa0: 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d  ower(zLeft[0])==
bfb0: 27 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  'q');..    /* If
bfc0: 20 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d   the PRAGMA comm
bfd0: 61 6e 64 20 77 61 73 20 6f 66 20 74 68 65 20 66  and was of the f
bfe0: 6f 72 6d 20 22 50 52 41 47 4d 41 20 3c 64 62 3e  orm "PRAGMA <db>
bff0: 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
c000: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 69  ",.    ** then i
c010: 44 62 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Db is set to the
c020: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
c030: 74 61 62 61 73 65 20 69 64 65 6e 74 69 66 69 65  tabase identifie
c040: 64 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a  d by <db>..    *
c050: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
c060: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
c070: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 6f 6e   database iDb on
c080: 6c 79 20 69 73 20 76 65 72 69 66 69 65 64 20 62  ly is verified b
c090: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 56 44 42  y.    ** the VDB
c0a0: 45 20 63 72 65 61 74 65 64 20 62 65 6c 6f 77 2e  E created below.
c0b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
c0c0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
c0d0: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d   command was sim
c0e0: 70 6c 79 20 22 50 52 41 47 4d 41 20 69 6e 74 65  ply "PRAGMA inte
c0f0: 67 72 69 74 79 5f 63 68 65 63 6b 22 20 28 6f 72  grity_check" (or
c100: 0a 20 20 20 20 2a 2a 20 22 50 52 41 47 4d 41 20  .    ** "PRAGMA 
c110: 71 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74  quick_check"), t
c120: 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74  hen iDb is set t
c130: 6f 20 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73  o 0. In this cas
c140: 65 2c 20 73 65 74 20 69 44 62 0a 20 20 20 20 2a  e, set iDb.    *
c150: 2a 20 74 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f  * to -1 here, to
c160: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
c170: 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 76  he VDBE should v
c180: 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72  erify the integr
c190: 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c  ity.    ** of al
c1a0: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
c1b0: 61 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ases.  */.    as
c1c0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a  sert( iDb>=0 );.
c1d0: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
c1e0: 3d 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b  =0 || pId2->z );
c1f0: 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 7a  .    if( pId2->z
c200: 3d 3d 30 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a  ==0 ) iDb = -1;.
c210: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
c220: 7a 65 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ze the VDBE prog
c230: 72 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  ram */.    pPars
c240: 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20  e->nMem = 6;..  
c250: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 78    /* Set the max
c260: 69 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74  imum error count
c270: 20 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d 20   */.    mxErr = 
c280: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
c290: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
c2a0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
c2b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c2c0: 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74  3GetInt32(zRight
c2d0: 2c 20 26 6d 78 45 72 72 29 3b 0a 20 20 20 20 20  , &mxErr);.     
c2e0: 20 69 66 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b   if( mxErr<=0 ){
c2f0: 0a 20 20 20 20 20 20 20 20 6d 78 45 72 72 20 3d  .        mxErr =
c300: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
c310: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
c320: 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  X;.      }.    }
c330: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c340: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c350: 65 67 65 72 2c 20 6d 78 45 72 72 2c 20 31 29 3b  eger, mxErr, 1);
c360: 20 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64    /* reg[1] hold
c370: 73 20 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f  s errors left */
c380: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69  ..    /* Do an i
c390: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
c3a0: 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
c3b0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  file */.    for(
c3c0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
c3d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68  i++){.      Hash
c3e0: 45 6c 65 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48  Elem *x;.      H
c3f0: 61 73 68 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20  ash *pTbls;.    
c400: 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20    int *aRoot;.  
c410: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
c420: 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78  .      int mxIdx
c430: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
c440: 6e 49 64 78 3b 0a 0a 20 20 20 20 20 20 69 66 28  nIdx;..      if(
c450: 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20   OMIT_TEMPDB && 
c460: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
c470: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d  .      if( iDb>=
c480: 30 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f  0 && i!=iDb ) co
c490: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73  ntinue;..      s
c4a0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
c4b0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
c4c0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
c4d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c4e0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  1(v, OP_IfPos, 1
c4f0: 29 3b 20 2f 2a 20 48 61 6c 74 20 69 66 20 6f 75  ); /* Halt if ou
c500: 74 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  t of errors */. 
c510: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
c520: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
c530: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c540: 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b   OP_Halt, 0, 0);
c550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c560: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c570: 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  dr);..      /* D
c580: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
c590: 68 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72  heck of the B-Tr
c5a0: 65 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ee.      **.    
c5b0: 20 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69    ** Begin by fi
c5c0: 6e 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70  nding the root p
c5d0: 61 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20 20  ages numbers.   
c5e0: 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61     ** for all ta
c5f0: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
c600: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
c610: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c620: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c630: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
c640: 64 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20 20  db, i, 0) );.   
c650: 20 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e     pTbls = &db->
c660: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[i].pSchema->
c670: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 66  tblHash;.      f
c680: 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69  or(cnt=0, x=sqli
c690: 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c  teHashFirst(pTbl
c6a0: 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48  s); x; x=sqliteH
c6b0: 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20  ashNext(x)){.   
c6c0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c6d0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c6e0: 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e  a(x);.        In
c6f0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20  dex *pIdx;.     
c700: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
c710: 70 54 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  pTab) ) cnt++;. 
c720: 20 20 20 20 20 20 20 66 6f 72 28 6e 49 64 78 3d         for(nIdx=
c730: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c740: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c750: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49  =pIdx->pNext, nI
c760: 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a  dx++){ cnt++; }.
c770: 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 64 78          if( nIdx
c780: 3e 6d 78 49 64 78 20 29 20 6d 78 49 64 78 20 3d  >mxIdx ) mxIdx =
c790: 20 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   nIdx;.      }. 
c7a0: 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c       aRoot = sql
c7b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c7c0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
c7d0: 29 2a 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20  )*(cnt+1));.    
c7e0: 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29    if( aRoot==0 )
c7f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
c800: 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74  r(cnt=0, x=sqlit
c810: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
c820: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
c830: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
c840: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c850: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c860: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
c870: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20  ex *pIdx;.      
c880: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
c890: 54 61 62 29 20 29 20 61 52 6f 6f 74 5b 63 6e 74  Tab) ) aRoot[cnt
c8a0: 2b 2b 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  ++] = pTab->tnum
c8b0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
c8c0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c8d0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c8e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
c8f0: 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d      aRoot[cnt++]
c900: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
c910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c920: 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74  .      aRoot[cnt
c930: 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  ] = 0;..      /*
c940: 20 4d 61 6b 65 20 73 75 72 65 20 73 75 66 66 69   Make sure suffi
c950: 63 69 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  cient number of 
c960: 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62  registers have b
c970: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
c980: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c990: 4d 65 6d 20 3d 20 4d 41 58 28 20 70 50 61 72 73  Mem = MAX( pPars
c9a0: 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78  e->nMem, 8+mxIdx
c9b0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f   );..      /* Do
c9c0: 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65   the b-tree inte
c9d0: 67 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a  grity checks */.
c9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c9f0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
ca00: 74 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e  tegrityCk, 2, cn
ca10: 74 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f  t, 1, (char*)aRo
ca20: 6f 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  ot,P4_INTARRAY);
ca30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ca40: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
ca50: 38 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72  8)i);.      addr
ca60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ca70: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
ca80: 6c 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72  l, 2); VdbeCover
ca90: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
caa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
cab0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
cac0: 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 3, 0,.        
cad0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
cae0: 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61  db, "*** in data
caf0: 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20  base %s ***\n", 
cb00: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
cb10: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50  ame),.         P
cb20: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
cb30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cb40: 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op3(v, OP_Move, 
cb50: 32 2c 20 34 2c 20 31 29 3b 0a 20 20 20 20 20 20  2, 4, 1);.      
cb60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cb70: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
cb80: 34 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20 20 20  4, 3, 2);.      
cb90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cba0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
cbb0: 77 2c 20 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  w, 2, 1);.      
cbc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cbd0: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20  ere(v, addr);.. 
cbe0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
cbf0: 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65  e all the indice
cc00: 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65  s are constructe
cc10: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  d correctly..   
cc20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
cc30: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
cc40: 74 28 70 54 62 6c 73 29 3b 20 78 20 26 26 20 21  t(pTbls); x && !
cc50: 69 73 51 75 69 63 6b 3b 20 78 3d 73 71 6c 69 74  isQuick; x=sqlit
cc60: 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20  eHashNext(x)){. 
cc70: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
cc80: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
cc90: 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20  ata(x);.        
cca0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 2a 70 50  Index *pIdx, *pP
ccb0: 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  k;.        Index
ccc0: 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20   *pPrior = 0;.  
ccd0: 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f        int loopTo
cce0: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
ccf0: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
cd00: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
cd10: 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20   = -1;..        
cd20: 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  if( pTab->pIndex
cd30: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
cd40: 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 48 61          pPk = Ha
cd50: 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30  sRowid(pTab) ? 0
cd60: 20 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   : sqlite3Primar
cd70: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
cd80: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
cd90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cda0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  1(v, OP_IfPos, 1
cdb0: 29 3b 20 20 2f 2a 20 53 74 6f 70 20 69 66 20 6f  );  /* Stop if o
cdc0: 75 74 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ut of errors */.
cdd0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
cde0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
cdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce00: 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  p2(v, OP_Halt, 0
ce10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
ce20: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ce30: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
ce40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ce50: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
ce60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ce70: 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e  e3OpenTableAndIn
ce80: 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54  dices(pParse, pT
ce90: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  ab, OP_OpenRead,
cea0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44         1, 0, &iD
ced0: 61 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72  ataCur, &iIdxCur
cee0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cef0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cf00: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37  OP_Integer, 0, 7
cf10: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
cf20: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
cf30: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
cf40: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
cf50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
cf60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cf70: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
cf80: 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65  0, 8+j); /* inde
cf90: 78 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65  x entries counte
cfa0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  r */.        }. 
cfb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cfc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a  Parse->nMem>=8+j
cfd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
cfe0: 72 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d  rt( sqlite3NoTem
cff0: 70 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65  psInRange(pParse
d000: 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20  ,1,7+j) );.     
d010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d020: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
d030: 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b  d, iDataCur, 0);
d040: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d050: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f  ;.        loopTo
d060: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
d070: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
d080: 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20  mm, 7, 1);.     
d090: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
d0a0: 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63  t all NOT NULL c
d0b0: 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72  olumns really ar
d0c0: 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e NOT NULL */.  
d0d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
d0e0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
d0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
d100: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
d110: 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70     int jmp2, jmp
d120: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  3;.          if(
d130: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
d140: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d150: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
d160: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
d170: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
d180: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d190: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
d1a0: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
d1b0: 2c 20 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 33  , iDataCur, j, 3
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d1d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
d1e0: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
d1f0: 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
d200: 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56   jmp2 = sqlite3V
d210: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d220: 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62  NotNull, 3); Vdb
d230: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d250: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d260: 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 20  AddImm, 1, -1); 
d270: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65 72 72  /* Decrement err
d280: 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20  or limit */.    
d290: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c        zErr = sql
d2a0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d2b0: 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25  "NULL value in %
d2c0: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
d2d0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e    pTab->aCol[j].
d300: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
d310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d320: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
d330: 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72  8, 0, 3, 0, zErr
d340: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
d350: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d360: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d370: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31  _ResultRow, 3, 1
d380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
d390: 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  3 = sqlite3VdbeA
d3a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
d3b0: 73 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72  s, 1); VdbeCover
d3c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d3d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d3e0: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
d3f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d400: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d410: 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20  , jmp2);.       
d420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d430: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 33 29 3b  mpHere(v, jmp3);
d440: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d450: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 69     /* Validate i
d460: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72  ndex entries for
d470: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
d480: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
d490: 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  j=0, pIdx=pTab->
d4a0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
d4b0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
d4c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
d4d0: 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20  int jmp2, jmp3, 
d4e0: 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20  jmp4, jmp5;.    
d4f0: 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71        int ckUniq
d500: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d510: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d520: 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70        if( pPk==p
d530: 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Idx ) continue;.
d540: 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
d550: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
d560: 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
d570: 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30  Idx, iDataCur, 0
d580: 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20  , 0, &jmp3,.    
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a     pPrior, r1);.
d5c0: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
d5d0: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
d5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
d600: 6d 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20  m, 8+j, 1);  /* 
d610: 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20  increment entry 
d620: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  count */.       
d630: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
d640: 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
d650: 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65 20   exists for the 
d660: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f  current table ro
d670: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6a  w */.          j
d680: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp2 = sqlite3Vdb
d690: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
d6a0: 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b  _Found, iIdxCur+
d6b0: 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20  j, ckUniq, r1,. 
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6e0: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
d6f0: 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  mn); VdbeCoverag
d700: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d720: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
d730: 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63 72 65  1, -1); /* Decre
d740: 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d 69 74  ment error limit
d750: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
d760: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d770: 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22  ing(v, 3, "row "
d780: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d7a0: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20  , OP_Concat, 7, 
d7b0: 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 3);.         
d7c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
d7d0: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d  String(v, 4, " m
d7e0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65  issing from inde
d7f0: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
d800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d810: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
d820: 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  4, 3, 3);.      
d830: 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69 74      jmp5 = sqlit
d840: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
d850: 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 4, pIdx->zNa
d860: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
d870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d880: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
d890: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
d8a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d8b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
d8c0: 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a 20 20 20  tRow, 3, 1);.   
d8d0: 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 73 71         jmp4 = sq
d8e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d8f0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b  v, OP_IfPos, 1);
d900: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d910: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d920: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
d930: 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 20   OP_Halt);.     
d940: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d950: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32  JumpHere(v, jmp2
d960: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
d970: 46 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78  For UNIQUE index
d980: 65 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  es, verify that 
d990: 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65  only one entry e
d9a0: 78 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20  xists with the. 
d9b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
d9c0: 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e  ent key.  The en
d9d0: 74 72 79 20 69 73 20 75 6e 69 71 75 65 20 69 66  try is unique if
d9e0: 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20   (1) any column 
d9f0: 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  is NULL.        
da00: 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20    ** or (2) the 
da10: 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61  next entry has a
da20: 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a   different key *
da30: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
da40: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
da50: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dx) ){.         
da60: 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20     int uniqOk = 
da70: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
da80: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
da90: 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20       int jmp6;. 
daa0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
dab0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  k;.            f
dac0: 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78  or(kk=0; kk<pIdx
dad0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29  ->nKeyCol; kk++)
dae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
daf0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  int iCol = pIdx-
db00: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20  >aiColumn[kk];. 
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
db20: 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f  ert( iCol!=XN_RO
db30: 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  WID && iCol<pTab
db40: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
db50: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
db60: 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  >=0 && pTab->aCo
db70: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
db80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
db90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dba0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dbb0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c  P_IsNull, r1+kk,
dbc0: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
dbd0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
dbe0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
dbf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
dc00: 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65     jmp6 = sqlite
dc10: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc20: 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b  P_Next, iIdxCur+
dc30: 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  j); VdbeCoverage
dc40: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
dc50: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
dc60: 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20  (v, uniqOk);.   
dc70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc80: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
dc90: 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp6);.         
dca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dcb0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
dcc0: 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  xGT, iIdxCur+j, 
dcd0: 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20  uniqOk, r1,.    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
dd00: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
dd10: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
dd20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dd30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dd40: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29  P_AddImm, 1, -1)
dd50: 3b 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65  ; /* Decrement e
dd60: 72 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  rror limit */.  
dd70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dd80: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
dd90: 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75  v, 3, "non-uniqu
dda0: 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78  e entry in index
ddb0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
ddc0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
ddd0: 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20  (v, jmp5);.     
dde0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ddf0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
de00: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
de10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
de20: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
de30: 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20  Here(v, jmp4);. 
de40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
de50: 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61  ResolvePartIdxLa
de60: 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33  bel(pParse, jmp3
de70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
de80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
dea0: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f  t, iDataCur, loo
deb0: 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72  pTop); VdbeCover
dec0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
ded0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
dee0: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31  ere(v, loopTop-1
def0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
df00: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
df10: 54 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  T.        sqlite
df20: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
df30: 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23 20 6f  v, 2, "wrong # o
df40: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e 64  f entries in ind
df50: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  ex ");.        f
df60: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
df70: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
df80: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
df90: 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, j++){.       
dfa0: 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78     if( pPk==pIdx
dfb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
dfc0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
dfd0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
dfe0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
dff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e000: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
e010: 2c 20 31 2c 20 61 64 64 72 2b 32 29 3b 20 56 64  , 1, addr+2); Vd
e020: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
e030: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e040: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e050: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
e060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e070: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e080: 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a  Count, iIdxCur+j
e090: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
e0a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e0b0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c  3(v, OP_Eq, 8+j,
e0c0: 20 61 64 64 72 2b 38 2c 20 33 29 3b 20 56 64 62   addr+8, 3); Vdb
e0d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
e0e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e0f0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
e100: 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  QLITE_NOTNULL);.
e110: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e120: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e130: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29  P_AddImm, 1, -1)
e140: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e150: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
e160: 67 28 76 2c 20 33 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 3, pIdx->zN
e170: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
e180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e190: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
e1a0: 33 2c 20 32 2c 20 37 29 3b 0a 20 20 20 20 20 20  3, 2, 7);.      
e1b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e1c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
e1d0: 6c 74 52 6f 77 2c 20 37 2c 20 31 29 3b 0a 20 20  ltRow, 7, 1);.  
e1e0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
e1f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
e200: 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
e210: 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 7b    } .    }.    {
e220: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e230: 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44  nst int iLn = VD
e240: 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f  BE_OFFSET_LINENO
e250: 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74 69  (2);.      stati
e260: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
e270: 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b  st endCode[] = {
e280: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64  .        { OP_Ad
e290: 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c  dImm,      1, 0,
e2a0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
e2b0: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 0 */.        {
e2c0: 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20   OP_If,         
e2d0: 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30 7d   1, 4,        0}
e2e0: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
e2f0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
e300: 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20  8,     0, 3,    
e310: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20      0},    /* 2 
e320: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
e330: 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20  ResultRow,   3, 
e340: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  1,        0},   
e350: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7d   /* 3 */.      }
e360: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
e370: 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20  aOp;..      aOp 
e380: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e390: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
e3a0: 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e  ize(endCode), en
e3b0: 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20  dCode, iLn);.   
e3c0: 20 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20     if( aOp ){.  
e3d0: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20        aOp[0].p2 
e3e0: 3d 20 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20  = -mxErr;.      
e3f0: 20 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20    aOp[2].p4type 
e400: 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20  = P4_STATIC;.   
e410: 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a       aOp[2].p4.z
e420: 20 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 7d   = "ok";.      }
e430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
e440: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
e450: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
e460: 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
e470: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e480: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a  T_UTF16.  /*.  *
e490: 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  *   PRAGMA encod
e4a0: 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ing.  **   PRAGM
e4b0: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74  A encoding = "ut
e4c0: 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75  f-8"|"utf-16"|"u
e4d0: 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36  tf-16le"|"utf-16
e4e0: 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  be".  **.  ** In
e4f0: 20 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d 2c   its first form,
e500: 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65 74   this pragma ret
e510: 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  urns the encodin
e520: 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20  g of the main.  
e530: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  ** database. If 
e540: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
e550: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  not initialized,
e560: 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
e570: 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a  ed now..  **.  *
e580: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
e590: 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61  m of this pragma
e5a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
e5b0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e5c0: 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e   file.  ** has n
e5d0: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
e5e0: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20  initialized. In 
e5f0: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65 74  this case it set
e600: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  s the default.  
e610: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74  ** encoding that
e620: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
e630: 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
e640: 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65  ase file if a ne
e650: 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63  w file.  ** is c
e660: 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78  reated. If an ex
e670: 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61  isting main data
e680: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
e690: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ned, then the.  
e6a0: 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74 20  ** default text 
e6b0: 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65  encoding for the
e6c0: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
e6d0: 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a  se is used..  **
e6e0: 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61   .  ** In all ca
e6f0: 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73 65  ses new database
e700: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
e710: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
e720: 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61  nd are.  ** crea
e730: 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 73  ted to use the s
e740: 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78 74  ame default text
e750: 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65   encoding as the
e760: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
e770: 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e  If.  ** the main
e780: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
e790: 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  t been initializ
e7a0: 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65  ed and/or create
e7b0: 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20  d when ATTACH.  
e7c0: 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c 20  ** is executed, 
e7d0: 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  this is done bef
e7e0: 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20 6f  ore the ATTACH o
e7f0: 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  peration..  **. 
e800: 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e   ** In the secon
e810: 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67  d form this prag
e820: 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78 74  ma sets the text
e830: 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20   encoding to be 
e840: 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77  used in.  ** new
e850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
e860: 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
e870: 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  is database hand
e880: 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20  le. It is only. 
e890: 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e   ** useful if in
e8a0: 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  voked immediatel
e8b0: 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e  y after the main
e8c0: 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f   database i.  */
e8d0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
e8e0: 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20  ENCODING: {.    
e8f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
e900: 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20  uct EncName {.  
e910: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
e920: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a 20  .      u8 enc;. 
e930: 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20     } encnames[] 
e940: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54 46  = {.      { "UTF
e950: 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 55  8",     SQLITE_U
e960: 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  TF8        },.  
e970: 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20      { "UTF-8",  
e980: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20    SQLITE_UTF8   
e990: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
e9a0: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20   be element [1] 
e9b0: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  */.      { "UTF-
e9c0: 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16le", SQLITE_UT
e9d0: 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a  F16LE     },  /*
e9e0: 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74   Must be element
e9f0: 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20   [2] */.      { 
ea00: 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c 49  "UTF-16be", SQLI
ea10: 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d  TE_UTF16BE     }
ea20: 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c  ,  /* Must be el
ea30: 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20  ement [3] */.   
ea40: 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20     { "UTF16le", 
ea50: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
ea60: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
ea70: 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49 54  UTF16be",  SQLIT
ea80: 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c  E_UTF16BE     },
ea90: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36  .      { "UTF-16
eaa0: 22 2c 20 20 20 30 20 20 20 20 20 20 20 20 20 20  ",   0          
eab0: 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51          }, /* SQ
eac0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
ead0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
eae0: 31 36 22 2c 20 20 20 20 30 20 20 20 20 20 20 20  16",    0       
eaf0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a             }, /*
eb00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
eb10: 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30  IVE */.      { 0
eb20: 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20  , 0 }.    };.   
eb30: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e   const struct En
eb40: 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20  cName *pEnc;.   
eb50: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 20   if( !zRight ){ 
eb60: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e     /* "PRAGMA en
eb70: 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20  coding" */.     
eb80: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
eb90: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
eba0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
ebb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ebc0: 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f  encnames[SQLITE_
ebd0: 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54  UTF8].enc==SQLIT
ebe0: 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20  E_UTF8 );.      
ebf0: 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73  assert( encnames
ec00: 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d  [SQLITE_UTF16LE]
ec10: 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  .enc==SQLITE_UTF
ec20: 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73  16LE );.      as
ec30: 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53  sert( encnames[S
ec40: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e 65  QLITE_UTF16BE].e
ec50: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
ec60: 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  BE );.      retu
ec70: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
ec80: 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61  encnames[ENC(pPa
ec90: 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29  rse->db)].zName)
eca0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20  ;.    }else{    
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
ecd0: 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20 2a  ncoding = XXX" *
ece0: 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  /.      /* Only 
ecf0: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
ed00: 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20 69   of sqlite.enc i
ed10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
ed20: 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20  andle is not.   
ed30: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
ed40: 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  d. If the main d
ed50: 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2c 20  atabase exists, 
ed60: 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e 65  the new sqlite.e
ed70: 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  nc value.      *
ed80: 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  * will be overwr
ed90: 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20 73  itten when the s
eda0: 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f  chema is next lo
edb0: 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73  aded. If it does
edc0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c   not.      ** al
edd0: 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 69 74  ready exists, it
ede0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
edf0: 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20   to use the new 
ee00: 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a  encoding value..
ee10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ee20: 66 28 20 0a 20 20 20 20 20 20 20 20 21 28 44 62  f( .        !(Db
ee30: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
ee40: 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  0, DB_SchemaLoad
ee50: 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  ed)) || .       
ee60: 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
ee70: 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29 20  b, 0, DB_Empty) 
ee80: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
ee90: 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e    for(pEnc=&encn
eea0: 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a  ames[0]; pEnc->z
eeb0: 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20  Name; pEnc++){. 
eec0: 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
eed0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
eee0: 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61  Right, pEnc->zNa
eef0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
ef00: 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62     SCHEMA_ENC(db
ef10: 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20 20  ) = ENC(db) =.  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
ef30: 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e  nc->enc ? pEnc->
ef40: 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54 46  enc : SQLITE_UTF
ef50: 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20 20  16NATIVE;.      
ef60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ef70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ef80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
ef90: 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pEnc->zName ){. 
efa0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
efb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
efc0: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65 6e   "unsupported en
efd0: 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69  coding: %s", zRi
efe0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ght);.        }.
eff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f000: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
f010: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f020: 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
f030: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f040: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52  CHEMA_VERSION_PR
f050: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
f060: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
f070: 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  .]schema_version
f080: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
f090: 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76  schema.]schema_v
f0a0: 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65  ersion = <intege
f0b0: 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  r>.  **.  **   P
f0c0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75  RAGMA [schema.]u
f0d0: 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  ser_version.  **
f0e0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f0f0: 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 20  a.]user_version 
f100: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
f110: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
f120: 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74  schema.]freelist
f130: 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a  _count.  **.  **
f140: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f150: 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a  a.]data_version.
f160: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
f170: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c  MA [schema.]appl
f180: 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20  ication_id.  ** 
f190: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
f1a0: 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64  .]application_id
f1b0: 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a   = <integer>.  *
f1c0: 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67 6d  *.  ** The pragm
f1d0: 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73 69  a's schema_versi
f1e0: 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72 73  on and user_vers
f1f0: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
f200: 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20  set or get.  ** 
f210: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
f220: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
f230: 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  and user-version
f240: 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
f250: 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73 63  Both.  ** the sc
f260: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64  hema-version and
f270: 20 74 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f   the user-versio
f280: 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73 69 67  n are 32-bit sig
f290: 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20 2a  ned integers.  *
f2a0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
f2b0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
f2c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
f2d0: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20  chema-cookie is 
f2e0: 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e  usually only man
f2f0: 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e 61  ipulated interna
f300: 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49  lly by SQLite. I
f310: 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d  t.  ** is increm
f320: 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  ented by SQLite 
f330: 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61 74  whenever the dat
f340: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
f350: 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20 2a  modified (by.  *
f360: 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 72  * creating or dr
f370: 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20 6f  opping a table o
f380: 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73 63  r index). The sc
f390: 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73 20  hema version is 
f3a0: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c  used by.  ** SQL
f3b0: 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  ite each time a 
f3c0: 71 75 65 72 79 20 69 73 20 65 78 65 63 75 74 65  query is execute
f3d0: 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
f3e0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
f3f0: 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  che.  ** of the 
f400: 73 63 68 65 6d 61 20 75 73 65 64 20 77 68 65 6e  schema used when
f410: 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53   compiling the S
f420: 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65 73  QL query matches
f430: 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a 20   the schema of. 
f440: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
f450: 20 61 67 61 69 6e 73 74 20 77 68 69 63 68 20 74   against which t
f460: 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72  he compiled quer
f470: 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78  y is actually ex
f480: 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62  ecuted..  ** Sub
f490: 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65 63  verting this mec
f4a0: 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67 20  hanism by using 
f4b0: 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76  "PRAGMA schema_v
f4c0: 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66  ersion" to modif
f4d0: 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
f4e0: 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 74  a-version is pot
f4f0: 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f  entially dangero
f500: 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64 20  us and may lead 
f510: 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20  to program.  ** 
f520: 63 72 61 73 68 65 73 20 6f 72 20 64 61 74 61 62  crashes or datab
f530: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
f540: 55 73 65 20 77 69 74 68 20 63 61 75 74 69 6f 6e  Use with caution
f550: 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  !.  **.  ** The 
f560: 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73 20  user-version is 
f570: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
f580: 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49  lly by SQLite. I
f590: 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 62 79  t may be used by
f5a0: 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  .  ** applicatio
f5b0: 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  ns for any purpo
f5c0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
f5d0: 50 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f 56  PragTyp_HEADER_V
f5e0: 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20  ALUE: {.    int 
f5f0: 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d  iCookie = pPragm
f600: 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68 69  a->iArg;  /* Whi
f610: 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61  ch cookie to rea
f620: 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20 20  d or write */.  
f630: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
f640: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
f650: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26      if( zRight &
f660: 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  & (pPragma->mPra
f670: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
f680: 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20  eadOnly)==0 ){. 
f690: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f6a0: 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b  e specified cook
f6b0: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  ie value */.    
f6c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56    static const V
f6d0: 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f 6f  dbeOpList setCoo
f6e0: 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  kie[] = {.      
f6f0: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
f700: 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20 30  on,    0,  1,  0
f710: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
f720: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f        { OP_SetCo
f730: 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 30  okie,      0,  0
f740: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a  ,  0},    /* 1 *
f750: 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  /.      };.     
f760: 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20   VdbeOp *aOp;.  
f770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
f780: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
f790: 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69  uired(v, ArraySi
f7a0: 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b 0a  ze(setCookie));.
f7b0: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
f7c0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
f7d0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65  (v, ArraySize(se
f7e0: 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f  tCookie), setCoo
f7f0: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  kie, 0);.      i
f800: 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c  f( ONLY_IF_REALL
f810: 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30  OC_STRESS(aOp==0
f820: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
f830: 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62   aOp[0].p1 = iDb
f840: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
f850: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
f860: 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b  Op[1].p2 = iCook
f870: 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  ie;.      aOp[1]
f880: 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74 6f  .p3 = sqlite3Ato
f890: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  i(zRight);.    }
f8a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52  else{.      /* R
f8b0: 65 61 64 20 74 68 65 20 73 70 65 63 69 66 69 65  ead the specifie
f8c0: 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  d cookie value *
f8d0: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
f8e0: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
f8f0: 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b  readCookie[] = {
f900: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72  .        { OP_Tr
f910: 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 30  ansaction,     0
f920: 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  0,  0},    /*
f930: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   0 */.        { 
f940: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
f950: 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20      0,  1,  0}, 
f960: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
f970: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
f980: 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c 20  w,       1,  1, 
f990: 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   0}.      };.   
f9a0: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
f9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9c0: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
f9d0: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
f9e0: 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29  Size(readCookie)
f9f0: 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73  );.      aOp = s
fa00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
fa10: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
fa20: 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65 61  (readCookie),rea
fa30: 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20 20  dCookie,0);.    
fa40: 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45    if( ONLY_IF_RE
fa50: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70  ALLOC_STRESS(aOp
fa60: 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
fa70: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
fa80: 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31  iDb;.      aOp[1
fa90: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
faa0: 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69 43    aOp[1].p3 = iC
fab0: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71 6c  ookie;.      sql
fac0: 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65  ite3VdbeReusable
fad0: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (v);.    }.  }. 
fae0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
faf0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  * SQLITE_OMIT_SC
fb00: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41  HEMA_VERSION_PRA
fb10: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
fb20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
fb30: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
fb40: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
fb50: 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74 69  GMA compile_opti
fb60: 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ons.  **.  ** Re
fb70: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  turn the names o
fb80: 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69  f all compile-ti
fb90: 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64 20  me options used 
fba0: 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a 20  in this build,. 
fbb0: 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20 70   ** one option p
fbc0: 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63  er row..  */.  c
fbd0: 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d 50  ase PragTyp_COMP
fbe0: 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20  ILE_OPTIONS: {. 
fbf0: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
fc00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
fc10: 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  pt;.    pParse->
fc20: 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77 68  nMem = 1;.    wh
fc30: 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71 6c  ile( (zOpt = sql
fc40: 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
fc50: 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30 20  on_get(i++))!=0 
fc60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fc70: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
fc80: 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20 20  , 1, zOpt);.    
fc90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fca0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
fcb0: 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  Row, 1, 1);.    
fcc0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
fcd0: 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20  eReusable(v);.  
fce0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
fcf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fd00: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
fd10: 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  IAGS */..#ifndef
fd20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
fd30: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
fd40: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61 6c  GMA [schema.]wal
fd50: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61  _checkpoint = pa
fd60: 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61  ssive|full|resta
fd70: 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a 2a  rt|truncate.  **
fd80: 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  .  ** Checkpoint
fd90: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
fda0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
fdb0: 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49 4e  yp_WAL_CHECKPOIN
fdc0: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42 74  T: {.    int iBt
fdd0: 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62 3a   = (pId2->z?iDb:
fde0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
fdf0: 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65 4d  HED);.    int eM
fe00: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
fe10: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3b  CKPOINT_PASSIVE;
fe20: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
fe30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
fe40: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
fe50: 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20 29  ht, "full")==0 )
fe60: 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
fe70: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
fe80: 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  INT_FULL;.      
fe90: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
fea0: 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c  3StrICmp(zRight,
feb0: 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20 29   "restart")==0 )
fec0: 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
fed0: 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  = SQLITE_CHECKPO
fee0: 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20 20  INT_RESTART;.   
fef0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
ff00: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
ff10: 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29 3d  ht, "truncate")=
ff20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
ff30: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
ff40: 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
ff50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ff60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
ff70: 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 3;.    sqlite
ff80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ff90: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 42  P_Checkpoint, iB
ffa0: 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20 20  t, eMode, 1);.  
ffb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ffc0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
ffd0: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d 0a  Row, 1, 3);.  }.
ffe0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20    break;..  /*. 
fff0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c   **   PRAGMA wal
10000 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a  _autocheckpoint.
10010 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61    **   PRAGMA wa
10020 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
10030 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   = N.  **.  ** C
10040 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74 61 62  onfigure a datab
10050 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
10060 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
10070 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74  checkpoint a dat
10080 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65 72  abase.  ** after
10090 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20   accumulating N 
100a0 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
100b0 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72 20  g. Or query for 
100c0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
100d0 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a  e.  ** of N..  *
100e0 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
100f0 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
10100 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  INT: {.    if( z
10110 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
10120 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
10130 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71  heckpoint(db, sq
10140 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
10150 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
10160 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
10170 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57 61   .       db->xWa
10180 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69 74  lCallback==sqlit
10190 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
101a0 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 53   ? .           S
101b0 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
101c0 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a 20  (db->pWalArg) : 
101d0 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  0);.  }.  break;
101e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
101f0 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69 6e  **  PRAGMA shrin
10200 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20  k_memory.  **.  
10210 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
10220 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34 36  N-OF: R-23445-46
10230 31 30 39 20 54 68 69 73 20 70 72 61 67 6d 61 20  109 This pragma 
10240 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
10250 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  ase.  ** connect
10260 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74 20  ion on which it 
10270 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66 72  is invoked to fr
10280 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65  ee up as much me
10290 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a 20  mory as it.  ** 
102a0 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67 20  can, by calling 
102b0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
102c0 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20 2a  se_memory()..  *
102d0 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
102e0 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20  _SHRINK_MEMORY: 
102f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  {.    sqlite3_db
10300 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
10310 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
10320 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
10330 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d   PRAGMA busy_tim
10340 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50 52 41 47  eout.  **   PRAG
10350 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  MA busy_timeout 
10360 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61  = N.  **.  ** Ca
10370 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  ll sqlite3_busy_
10380 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20  timeout(db, N). 
10390 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
103a0 65 6e 74 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  ent timeout valu
103b0 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73  e.  ** if one is
103c0 20 73 65 74 2e 20 20 49 66 20 6e 6f 20 62 75 73   set.  If no bus
103d0 79 20 68 61 6e 64 6c 65 72 20 6f 72 20 61 20 64  y handler or a d
103e0 69 66 66 65 72 65 6e 74 20 62 75 73 79 20 68 61  ifferent busy ha
103f0 6e 64 6c 65 72 20 69 73 20 73 65 74 0a 20 20 2a  ndler is set.  *
10400 2a 20 74 68 65 6e 20 30 20 69 73 20 72 65 74 75  * then 0 is retu
10410 72 6e 65 64 2e 20 20 53 65 74 74 69 6e 67 20 74  rned.  Setting t
10420 68 65 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  he busy_timeout 
10430 74 6f 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  to 0 or negative
10440 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 73 20 74  .  ** disables t
10450 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f  he timeout..  */
10460 0a 20 20 2f 2a 63 61 73 65 20 50 72 61 67 54 79  .  /*case PragTy
10470 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 2a 2f  p_BUSY_TIMEOUT*/
10480 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
10490 61 73 73 65 72 74 28 20 70 50 72 61 67 6d 61 2d  assert( pPragma-
104a0 3e 65 50 72 61 67 54 79 70 3d 3d 50 72 61 67 54  >ePragTyp==PragT
104b0 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 20  yp_BUSY_TIMEOUT 
104c0 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
104d0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
104e0 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
104f0 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  db, sqlite3Atoi(
10500 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a  zRight));.    }.
10510 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
10520 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75 73 79 54  Int(v, db->busyT
10530 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 62 72 65  imeout);.    bre
10540 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
10550 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74  **   PRAGMA soft
10560 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _heap_limit.  **
10570 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68     PRAGMA soft_h
10580 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20 20  eap_limit = N.  
10590 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
105a0 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33  TATION-OF: R-263
105b0 34 33 2d 34 35 39 33 30 20 54 68 69 73 20 70 72  43-45930 This pr
105c0 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20 74 68 65  agma invokes the
105d0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f  .  ** sqlite3_so
105e0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
105f0 29 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  ) interface with
10600 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 4e 2c   the argument N,
10610 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a 20 73 70   if N is.  ** sp
10620 65 63 69 66 69 65 64 20 61 6e 64 20 69 73 20 61  ecified and is a
10630 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
10640 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c  teger..  ** IMPL
10650 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
10660 2d 36 34 34 35 31 2d 30 37 31 36 33 20 54 68 65  -64451-07163 The
10670 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
10680 20 70 72 61 67 6d 61 20 61 6c 77 61 79 73 0a 20   pragma always. 
10690 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20   ** returns the 
106a0 73 61 6d 65 20 69 6e 74 65 67 65 72 20 74 68 61  same integer tha
106b0 74 20 77 6f 75 6c 64 20 62 65 20 72 65 74 75 72  t would be retur
106c0 6e 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20  ned by the.  ** 
106d0 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
106e0 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 20 43 2d  p_limit64(-1) C-
106f0 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 74 69 6f  language functio
10700 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  n..  */.  case P
10710 72 61 67 54 79 70 5f 53 4f 46 54 5f 48 45 41 50  ragTyp_SOFT_HEAP
10720 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 73 71  _LIMIT: {.    sq
10730 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20  lite3_int64 N;. 
10740 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26     if( zRight &&
10750 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
10760 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e  ToI64(zRight, &N
10770 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
10780 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f        sqlite3_so
10790 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
107a0 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  N);.    }.    re
107b0 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
107c0 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
107d0 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 29 3b  ap_limit64(-1));
107e0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
107f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
10800 47 4d 41 20 74 68 72 65 61 64 73 0a 20 20 2a 2a  GMA threads.  **
10810 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64     PRAGMA thread
10820 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s = N.  **.  ** 
10830 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 6d 61  Configure the ma
10840 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
10850 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 2e 20  worker threads. 
10860 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 0a   Return the new.
10870 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c 20 77 68    ** maximum, wh
10880 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 73  ich might be les
10890 73 20 74 68 61 6e 20 72 65 71 75 65 73 74 65 64  s than requested
108a0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
108b0 61 67 54 79 70 5f 54 48 52 45 41 44 53 3a 20 7b  agTyp_THREADS: {
108c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
108d0 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52  64 N;.    if( zR
108e0 69 67 68 74 0a 20 20 20 20 20 26 26 20 73 71 6c  ight.     && sql
108f0 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
10900 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53  4(zRight, &N)==S
10910 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26  QLITE_OK.     &&
10920 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20   N>=0.    ){.   
10930 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
10940 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49  (db, SQLITE_LIMI
10950 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
10960 2c 20 28 69 6e 74 29 28 4e 26 30 78 37 66 66 66  , (int)(N&0x7fff
10970 66 66 66 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ffff));.    }.  
10980 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
10990 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 6c 69 6d  t(v, sqlite3_lim
109a0 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49  it(db, SQLITE_LI
109b0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
109c0 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72  DS, -1));.    br
109d0 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65  eak;.  }..#if de
109e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
109f0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
10a00 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a  QLITE_TEST).  /*
10a10 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  .  ** Report the
10a20 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
10a30 66 20 66 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20  f file logs for 
10a40 61 6c 6c 20 64 61 74 61 62 61 73 65 73 0a 20 20  all databases.  
10a50 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
10a60 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53 3a 20 7b  p_LOCK_STATUS: {
10a70 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
10a80 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a  t char *const az
10a90 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  LockName[] = {. 
10aa0 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65 64 22 2c       "unlocked",
10ab0 20 22 73 68 61 72 65 64 22 2c 20 22 72 65 73 65   "shared", "rese
10ac0 72 76 65 64 22 2c 20 22 70 65 6e 64 69 6e 67 22  rved", "pending"
10ad0 2c 20 22 65 78 63 6c 75 73 69 76 65 22 0a 20 20  , "exclusive".  
10ae0 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    };.    int i;.
10af0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
10b00 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 2;.    for(i=
10b10 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
10b20 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
10b30 2a 70 42 74 3b 0a 20 20 20 20 20 20 63 6f 6e 73  *pBt;.      cons
10b40 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 20 3d  t char *zState =
10b50 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20   "unknown";.    
10b60 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
10b70 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  f( db->aDb[i].zD
10b80 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  bSName==0 ) cont
10b90 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 42 74 20  inue;.      pBt 
10ba0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
10bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 3d  ;.      if( pBt=
10bc0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
10bd0 65 65 50 61 67 65 72 28 70 42 74 29 3d 3d 30 20  eePager(pBt)==0 
10be0 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 74 61 74  ){.        zStat
10bf0 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20  e = "closed";.  
10c00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
10c10 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
10c20 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61  ol(db, i ? db->a
10c30 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  Db[i].zDbSName :
10c40 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10c70 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
10c80 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &j)==SQLITE_OK
10c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 7a 53 74   ){.         zSt
10ca0 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65  ate = azLockName
10cb0 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
10cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
10cd0 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
10ce0 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  s", db->aDb[i].z
10cf0 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29  DbSName, zState)
10d00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10d10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d20 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29  ResultRow, 1, 2)
10d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
10d40 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
10d50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
10d60 5f 43 4f 44 45 43 0a 20 20 63 61 73 65 20 50 72  _CODEC.  case Pr
10d70 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20  agTyp_KEY: {.   
10d80 20 69 66 28 20 7a 52 69 67 68 74 20 29 20 73 71   if( zRight ) sq
10d90 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
10da0 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73 71   zDb, zRight, sq
10db0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52  lite3Strlen30(zR
10dc0 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65 61  ight));.    brea
10dd0 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72  k;.  }.  case Pr
10de0 61 67 54 79 70 5f 52 45 4b 45 59 3a 20 7b 0a 20  agTyp_REKEY: {. 
10df0 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20     if( zRight ) 
10e00 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32  sqlite3_rekey_v2
10e10 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74  (db, zDb, zRight
10e20 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
10e30 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  0(zRight));.    
10e40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73  break;.  }.  cas
10e50 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45 59  e PragTyp_HEXKEY
10e60 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
10e70 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69  ht ){.      u8 i
10e80 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Byte;.      int 
10e90 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b  i;.      char zK
10ea0 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f  ey[40];.      fo
10eb0 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20  r(i=0, iByte=0; 
10ec0 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32  i<sizeof(zKey)*2
10ed0 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
10ee0 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20  git(zRight[i]); 
10ef0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42  i++){.        iB
10f00 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29  yte = (iByte<<4)
10f10 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49   + sqlite3HexToI
10f20 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20  nt(zRight[i]);. 
10f30 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29         if( (i&1)
10f40 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20  !=0 ) zKey[i/2] 
10f50 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = iByte;.      }
10f60 0a 20 20 20 20 20 20 69 66 28 20 28 7a 4c 65 66  .      if( (zLef
10f70 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d 30 78 62  t[3] & 0xf)==0xb
10f80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10f90 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a  te3_key_v2(db, z
10fa0 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a  Db, zKey, i/2);.
10fb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10fc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b       sqlite3_rek
10fd0 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
10fe0 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20  Key, i/2);.     
10ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
11000 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ak;.  }.#endif.#
11010 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
11020 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20  E_HAS_CODEC) || 
11030 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
11040 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63  NABLE_CEROD).  c
11050 61 73 65 20 50 72 61 67 54 79 70 5f 41 43 54 49  ase PragTyp_ACTI
11060 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a  VATE_EXTENSIONS:
11070 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 23   if( zRight ){.#
11080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
11090 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 73  _CODEC.    if( s
110a0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
110b0 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20 34  Right, "see-", 4
110c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
110d0 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73  lite3_activate_s
110e0 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a  ee(&zRight[4]);.
110f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
11100 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11110 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28 20  E_CEROD.    if( 
11120 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
11130 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d 22  zRight, "cerod-"
11140 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 6)==0 ){.     
11150 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
11160 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74 5b  e_cerod(&zRight[
11170 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  6]);.    }.#endi
11180 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  f.  }.  break;.#
11190 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e  endif..  } /* En
111a0 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  d of the PRAGMA 
111b0 73 77 69 74 63 68 20 2a 2f 0a 0a 70 72 61 67 6d  switch */..pragm
111c0 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  a_out:.  sqlite3
111d0 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65 66 74  DbFree(db, zLeft
111e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
111f0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 56 61  stDelete(db, pVa
11200 6c 75 65 73 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  lues);.}.#ifndef
11210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
11220 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a  TUALTABLE./*****
11230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11270 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c  ********.** Impl
11280 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e  ementation of an
11290 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
112a0 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72 75  al table that ru
112b0 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a  ns a pragma..**.
112c0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
112d0 74 20 50 72 61 67 6d 61 56 74 61 62 20 50 72 61  t PragmaVtab Pra
112e0 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65 66  gmaVtab;.typedef
112f0 20 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74   struct PragmaVt
11300 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61 56  abCursor PragmaV
11310 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75 63  tabCursor;.struc
11320 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a 20  t PragmaVtab {. 
11330 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61   sqlite3_vtab ba
11340 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 61  se;        /* Ba
11350 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20  se class.  Must 
11360 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
11370 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
11380 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
11390 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
113a0 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20 62  on to which it b
113b0 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73  elongs */.  cons
113c0 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e  t PragmaName *pN
113d0 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
113e0 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20   the pragma */. 
113f0 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20 20   u8 nHidden;    
11400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11410 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63  mber of hidden c
11420 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
11430 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20  Hidden;         
11440 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
11450 66 20 74 68 65 20 66 69 72 73 74 20 68 69 64 64  f the first hidd
11460 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a  en column */.};.
11470 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
11480 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69  bCursor {.  sqli
11490 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
114a0 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c  base; /* Base cl
114b0 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69  ass.  Must be fi
114c0 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rst */.  sqlite3
114d0 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20  _stmt *pPragma; 
114e0 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d 61     /* The pragma
114f0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 75   statement to ru
11500 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e  n */.  sqlite_in
11510 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  t64 iRowid;     
11520 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
11530 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41  d */.  char *azA
11540 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  rg[2];          
11550 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
11560 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 63   argument and sc
11570 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  hema */.};../* .
11580 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
11590 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
115a0 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a  Connect method..
115b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
115c0 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74 28  agmaVtabConnect(
115d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
115e0 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
115f0 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
11600 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
11610 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
11620 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
11630 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63  r **pzErr.){.  c
11640 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
11650 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73  *pPragma = (cons
11660 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41  t PragmaName*)pA
11670 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  ux;.  PragmaVtab
11680 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e   *pTab = 0;.  in
11690 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
116a0 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d 20  ;.  char cSep = 
116b0 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  '(';.  StrAccum 
116c0 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  acc;.  char zBuf
116d0 5b 32 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  [200];..  sqlite
116e0 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61  3StrAccumInit(&a
116f0 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a  cc, 0, zBuf, siz
11700 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20  eof(zBuf), 0);. 
11710 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
11720 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20  AppendAll(&acc, 
11730 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22  "CREATE TABLE x"
11740 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  );.  for(i=0, j=
11750 70 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e  pPragma->iPragCN
11760 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e  ame; i<pPragma->
11770 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c  nPragCName; i++,
11780 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   j++){.    sqlit
11790 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20  e3XPrintf(&acc, 
117a0 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53 65 70  "%c\"%s\"", cSep
117b0 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29 3b  , pragCName[j]);
117c0 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b  .    cSep = ',';
117d0 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20  .  }.  if( i==0 
117e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
117f0 72 69 6e 74 66 28 26 61 63 63 2c 20 22 28 5c 22  rintf(&acc, "(\"
11800 25 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e  %s\"", pPragma->
11810 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 63 53 65 70  zName);.    cSep
11820 20 3d 20 27 2c 27 3b 0a 20 20 20 20 69 2b 2b 3b   = ',';.    i++;
11830 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  .  }.  j = 0;.  
11840 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
11850 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
11860 52 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73  Result1 ){.    s
11870 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
11880 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c  pendAll(&acc, ",
11890 61 72 67 20 48 49 44 44 45 4e 22 29 3b 0a 20 20  arg HIDDEN");.  
118a0 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    j++;.  }.  if(
118b0 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46   pPragma->mPragF
118c0 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 53 63  lg & (PragFlg_Sc
118d0 68 65 6d 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f  hemaOpt|PragFlg_
118e0 53 63 68 65 6d 61 52 65 71 29 20 29 7b 0a 20 20  SchemaReq) ){.  
118f0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
11900 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c  mAppendAll(&acc,
11910 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45 4e   ",schema HIDDEN
11920 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  ");.    j++;.  }
11930 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
11940 75 6d 41 70 70 65 6e 64 28 26 61 63 63 2c 20 22  umAppend(&acc, "
11950 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  )", 1);.  sqlite
11960 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
11970 26 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28  &acc);.  assert(
11980 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20   strlen(zBuf) < 
11990 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29  sizeof(zBuf)-1 )
119a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
119b0 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
119c0 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72  , zBuf);.  if( r
119d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
119e0 20 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67      pTab = (Prag
119f0 6d 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f  maVtab*)sqlite3_
11a00 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72  malloc(sizeof(Pr
11a10 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20  agmaVtab));.    
11a20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
11a30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11a40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
11a50 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
11a60 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pTab, 0, sizeof(
11a70 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20  PragmaVtab));.  
11a80 20 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20      pTab->pName 
11a90 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20  = pPragma;.     
11aa0 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a   pTab->db = db;.
11ab0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64        pTab->iHid
11ac0 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  den = i;.      p
11ad0 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a  Tab->nHidden = j
11ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
11af0 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
11b00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
11b10 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
11b20 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20  sg(db));.  }..  
11b30 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  *ppVtab = (sqlit
11b40 65 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20  e3_vtab*)pTab;. 
11b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11b60 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
11b70 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
11b80 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65  e xDisconnect me
11b90 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
11ba0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69  int pragmaVtabDi
11bb0 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33  sconnect(sqlite3
11bc0 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
11bd0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
11be0 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
11bf0 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65  )pVtab;.  sqlite
11c00 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20  3_free(pTab);.  
11c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11c20 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f  ;.}../* Figure o
11c30 75 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ut the best inde
11c40 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72  x to use to sear
11c50 63 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74  ch a pragma virt
11c60 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
11c70 20 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72   There are not r
11c80 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20  eally any index 
11c90 63 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65  choices.  But we
11ca0 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61   want to encoura
11cb0 67 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  ge the.** query 
11cc0 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20  planner to give 
11cd0 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  == constraints o
11ce0 6e 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e  n as many hidden
11cf0 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a   parameters as.*
11d00 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20  * possible, and 
11d10 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68  especially on th
11d20 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70  e first hidden p
11d30 61 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65  arameter.  So re
11d40 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63  turn a.** high c
11d50 6f 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61  ost if hidden pa
11d60 72 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63  rameters are unc
11d70 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73  onstrained..*/.s
11d80 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
11d90 56 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71  VtabBestIndex(sq
11da0 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
11db0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
11dc0 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a  nfo *pIdxInfo){.
11dd0 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
11de0 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
11df0 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  *)tab;.  const s
11e00 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
11e10 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
11e20 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  pConstraint;.  i
11e30 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73  nt i, j;.  int s
11e40 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49  een[2];..  pIdxI
11e50 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
11e60 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  st = (double)1;.
11e70 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64    if( pTab->nHid
11e80 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e  den==0 ){ return
11e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20   SQLITE_OK; }.  
11ea0 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  pConstraint = pI
11eb0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
11ec0 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d  int;.  seen[0] =
11ed0 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20   0;.  seen[1] = 
11ee0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
11ef0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
11f00 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e  raint; i++, pCon
11f10 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20  straint++){.    
11f20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
11f30 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e  >usable==0 ) con
11f40 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
11f50 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d  Constraint->op!=
11f60 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
11f70 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e  STRAINT_EQ ) con
11f80 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
11f90 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
11fa0 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64  umn < pTab->iHid
11fb0 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  den ) continue;.
11fc0 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61      j = pConstra
11fd0 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  int->iColumn - p
11fe0 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20  Tab->iHidden;.  
11ff0 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20    assert( j < 2 
12000 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d  );.    seen[j] =
12010 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   i+1;.  }.  if( 
12020 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  seen[0]==0 ){.  
12030 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
12040 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
12050 62 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a  ble)2147483647;.
12060 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
12070 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31  timatedRows = 21
12080 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65  47483647;.    re
12090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
120a0 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30    }.  j = seen[0
120b0 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  ]-1;.  pIdxInfo-
120c0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
120d0 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  e[j].argvIndex =
120e0 20 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   1;.  pIdxInfo->
120f0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12100 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  [j].omit = 1;.  
12110 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29  if( seen[1]==0 )
12120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12130 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  K;.  pIdxInfo->e
12140 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
12150 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64  double)20;.  pId
12160 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
12170 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d  Rows = 20;.  j =
12180 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49   seen[1]-1;.  pI
12190 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
121a0 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76  intUsage[j].argv
121b0 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64  Index = 2;.  pId
121c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
121d0 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20  ntUsage[j].omit 
121e0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
121f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43  LITE_OK;.}../* C
12200 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
12210 6f 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d  or for the pragm
12220 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
12230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
12240 61 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c  agmaVtabOpen(sql
12250 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
12260 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
12270 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
12280 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
12290 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70  ursor *pCsr;.  p
122a0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
122b0 62 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33  bCursor*)sqlite3
122c0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
122d0 70 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43  pCsr));.  if( pC
122e0 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  sr==0 ) return S
122f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
12300 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
12310 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62  izeof(PragmaVtab
12320 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72  Cursor));.  pCsr
12330 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70  ->base.pVtab = p
12340 56 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f  Vtab;.  *ppCurso
12350 72 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b  r = &pCsr->base;
12360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12370 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72  _OK;.}../* Clear
12380 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f   all content fro
12390 6d 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  m pragma virtual
123a0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a   table cursor. *
123b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
123c0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
123d0 65 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75  ear(PragmaVtabCu
123e0 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
123f0 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
12400 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70  finalize(pCsr->p
12410 50 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d  Pragma);.  pCsr-
12420 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20  >pPragma = 0;.  
12430 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
12440 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  Size(pCsr->azArg
12450 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
12460 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
12470 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70  azArg[i]);.    p
12480 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20  Csr->azArg[i] = 
12490 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f  0;.  }.}../* Clo
124a0 73 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74  se a pragma virt
124b0 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
124c0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
124d0 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73  ragmaVtabClose(s
124e0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
124f0 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67  or *cur){.  Prag
12500 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
12510 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
12520 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70  Cursor*)cur;.  p
12530 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
12540 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71  lear(pCsr);.  sq
12550 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29  lite3_free(pCsr)
12560 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12570 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61  E_OK;.}../* Adva
12580 6e 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76  nce the pragma v
12590 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
125a0 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
125b0 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  row */.static in
125c0 74 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74  t pragmaVtabNext
125d0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
125e0 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
125f0 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
12600 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
12610 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
12620 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
12630 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12640 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  _OK;..  /* Incre
12650 6d 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20  ment the xRowid 
12660 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d  value */.  pCsr-
12670 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73  >iRowid++;.  ass
12680 65 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67  ert( pCsr->pPrag
12690 6d 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ma );.  if( SQLI
126a0 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f  TE_ROW!=sqlite3_
126b0 73 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67  step(pCsr->pPrag
126c0 6d 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ma) ){.    rc = 
126d0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
126e0 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b  (pCsr->pPragma);
126f0 0a 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67  .    pCsr->pPrag
12700 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67  ma = 0;.    prag
12710 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
12720 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72  r(pCsr);.  }.  r
12730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
12740 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
12750 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
12760 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a  xFilter method..
12770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
12780 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a  agmaVtabFilter(.
12790 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
127a0 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
127b0 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
127c0 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
127d0 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
127e0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
127f0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61   **argv.){.  Pra
12800 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
12810 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
12820 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
12830 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74  rsor;.  PragmaVt
12840 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
12850 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75  maVtab*)(pVtabCu
12860 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20  rsor->pVtab);.  
12870 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c  int rc;.  int i,
12880 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61   j;.  StrAccum a
12890 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  cc;.  char *zSql
128a0 3b 0a 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  ;..  pragmaVtabC
128b0 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29  ursorClear(pCsr)
128c0 3b 0a 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70  ;.  j = (pTab->p
128d0 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26  Name->mPragFlg &
128e0 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31   PragFlg_Result1
128f0 29 21 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20  )!=0 ? 0 : 1;.  
12900 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
12910 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
12920 61 73 73 65 72 74 28 20 6a 3c 41 72 72 61 79 53  assert( j<ArrayS
12930 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
12940 20 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a   );.    pCsr->az
12950 41 72 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33  Arg[j] = sqlite3
12960 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
12970 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12980 74 28 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20  t(argv[i]));.   
12990 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67   if( pCsr->azArg
129a0 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [j]==0 ){.      
129b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
129c0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
129d0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
129e0 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 30 2c  Init(&acc, 0, 0,
129f0 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c   0, pTab->db->aL
12a00 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
12a10 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a  T_SQL_LENGTH]);.
12a20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
12a30 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c  mAppendAll(&acc,
12a40 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69   "PRAGMA ");.  i
12a50 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  f( pCsr->azArg[1
12a60 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
12a70 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25  XPrintf(&acc, "%
12a80 51 2e 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  Q.", pCsr->azArg
12a90 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [1]);.  }.  sqli
12aa0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
12ab0 64 41 6c 6c 28 26 61 63 63 2c 20 70 54 61 62 2d  dAll(&acc, pTab-
12ac0 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  >pName->zName);.
12ad0 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
12ae0 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  g[0] ){.    sqli
12af0 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c  te3XPrintf(&acc,
12b00 20 22 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a   "=%Q", pCsr->az
12b10 41 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a  Arg[0]);.  }.  z
12b20 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Sql = sqlite3Str
12b30 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63  AccumFinish(&acc
12b40 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
12b50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12b60 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73  _NOMEM;.  rc = s
12b70 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
12b80 32 28 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c  2(pTab->db, zSql
12b90 2c 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72  , -1, &pCsr->pPr
12ba0 61 67 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69  agma, 0);.  sqli
12bb0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
12bc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  _OK ){.    pTab-
12be0 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20  >base.zErrMsg = 
12bf0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12c00 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
12c10 72 6d 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b  rmsg(pTab->db));
12c20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
12c30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61    }.  return pra
12c40 67 6d 61 56 74 61 62 4e 65 78 74 28 70 56 74 61  gmaVtabNext(pVta
12c50 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a  bCursor);.}../*.
12c60 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
12c70 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
12c80 45 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  Eof method..*/.s
12c90 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
12ca0 56 74 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f  VtabEof(sqlite3_
12cb0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
12cc0 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61  abCursor){.  Pra
12cd0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
12ce0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
12cf0 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
12d00 72 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  rsor;.  return (
12d10 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30  pCsr->pPragma==0
12d20 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f  );.}../* The xCo
12d30 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70  lumn method simp
12d40 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ly returns the c
12d50 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
12d60 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  umn from.** the 
12d70 50 52 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61  PRAGMA.  .*/.sta
12d80 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
12d90 61 62 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  abColumn(.  sqli
12da0 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
12db0 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20  *pVtabCursor, . 
12dc0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
12dd0 20 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a   *ctx, .  int i.
12de0 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
12df0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
12e00 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
12e10 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
12e20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
12e30 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
12e40 28 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56  (pVtabCursor->pV
12e50 74 61 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54  tab);.  if( i<pT
12e60 61 62 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20  ab->iHidden ){. 
12e70 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
12e80 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c  t_value(ctx, sql
12e90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
12ea0 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c  e(pCsr->pPragma,
12eb0 20 69 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i));.  }else{. 
12ec0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
12ed0 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 73 72  t_text(ctx, pCsr
12ee0 2d 3e 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e  ->azArg[i-pTab->
12ef0 69 48 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49  iHidden],-1,SQLI
12f00 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
12f10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12f20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  TE_OK;.}../* .**
12f30 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
12f40 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f  table module xRo
12f50 77 69 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  wid method..*/.s
12f60 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
12f70 56 74 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65  VtabRowid(sqlite
12f80 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
12f90 56 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69  VtabCursor, sqli
12fa0 74 65 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20  te_int64 *p){.  
12fb0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
12fc0 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61   *pCsr = (Pragma
12fd0 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61  VtabCursor*)pVta
12fe0 62 43 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20  bCursor;.  *p = 
12ff0 70 43 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pCsr->iRowid;.  
13000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13010 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67  ;.}../* The prag
13020 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13030 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69   object */.stati
13040 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
13050 6d 6f 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61  module pragmaVta
13060 62 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  bModule = {.  0,
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
13090 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  ersion */.  0,  
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65           /* xCre
130c0 61 74 65 20 2d 20 63 72 65 61 74 65 20 61 20 74  ate - create a t
130d0 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61  able */.  pragma
130e0 56 74 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20  VtabConnect,    
130f0 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65         /* xConne
13100 63 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20  ct - connect to 
13110 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
13120 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  e */.  pragmaVta
13130 62 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  bBestIndex,     
13140 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
13150 78 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65  x - Determine se
13160 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f  arch strategy */
13170 0a 20 20 70 72 61 67 6d 61 56 74 61 62 44 69 73  .  pragmaVtabDis
13180 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
13190 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d  /* xDisconnect -
131a0 20 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d   Disconnect from
131b0 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c   a table */.  0,
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
131e0 65 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20  estroy - Drop a 
131f0 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d  table */.  pragm
13200 61 56 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20  aVtabOpen,      
13210 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
13220 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
13230 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
13240 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
13250 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63     /* xClose - c
13260 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  lose a cursor */
13270 0a 20 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c  .  pragmaVtabFil
13280 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
13290 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e  /* xFilter - con
132a0 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73  figure scan cons
132b0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61  traints */.  pra
132c0 67 6d 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20  gmaVtabNext,    
132d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
132e0 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
132f0 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
13300 61 56 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20  aVtabEof,       
13310 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20          /* xEof 
13320 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  */.  pragmaVtabC
13330 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
13340 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
13350 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72  ead data */.  pr
13360 61 67 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20  agmaVtabRowid,  
13370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
13380 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
13390 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20     /* xUpdate - 
133c0 77 72 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20  write data */.  
133d0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
133f0 78 42 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74  xBegin - begin t
13400 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
13410 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13430 78 53 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61  xSync - sync tra
13440 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
13470 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74  ommit - commit t
13480 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
13490 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
134b0 78 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c  xRollback - roll
134c0 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
134d0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74     /* xFindFunct
13500 69 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f  ion - function o
13510 76 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20  verloading */.  
13520 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13540 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65  xRename - rename
13550 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
13560 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13580 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  xSavepoint */.  
13590 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
135b0 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20  xRelease */.  0 
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
135e0 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a  ollbackTo */.};.
135f0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
13600 73 65 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20  see if zTabName 
13610 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61  is really the na
13620 6d 65 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20  me of a pragma. 
13630 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68   If it is,.** th
13640 65 6e 20 72 65 67 69 73 74 65 72 20 61 6e 20 65  en register an e
13650 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
13660 20 74 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20   table for that 
13670 70 72 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72  pragma and retur
13680 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
13690 6f 20 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a  o the Module obj
136a0 65 63 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ect for the new 
136b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
136c0 2f 0a 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65  /.Module *sqlite
136d0 33 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73  3PragmaVtabRegis
136e0 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ter(sqlite3 *db,
136f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13700 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61  me){.  const Pra
13710 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a  gmaName *pName;.
13720 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13730 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65  3_strnicmp(zName
13740 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d  , "pragma_", 7)=
13750 3d 30 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20  =0 );.  pName = 
13760 70 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61  pragmaLocate(zNa
13770 6d 65 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61  me+7);.  if( pNa
13780 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
13790 3b 0a 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e  ;.  if( (pName->
137a0 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67  mPragFlg & (Prag
137b0 46 6c 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67  Flg_Result0|Prag
137c0 46 6c 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30  Flg_Result1))==0
137d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
137e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61  ssert( sqlite3Ha
137f0 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
13800 75 6c 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ule, zName)==0 )
13810 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
13820 65 33 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75  e3VtabCreateModu
13830 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70  le(db, zName, &p
13840 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c  ragmaVtabModule,
13850 20 28 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30   (void*)pName, 0
13860 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
13870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13880 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e  UALTABLE */..#en
13890 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
138a0 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a           IT_PRAGMA */.