/ Hex Artifact Content
Login

Artifact 26e6c5f11e87de33b6d1852be2b12471e0c32baa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  K );.    while( 
1ba0: 28 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20  (n--) > 0 ){.   
1bb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1bc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
1be0: 6c 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20  lags(pDb->pBt,. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  (pDb->safety_lev
1c10: 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  el & PAGER_SYNCH
1c20: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 0a 20 20 20  RONOUS_MASK).   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1c50: 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1c60: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c70: 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pDb++;.    }. 
1c80: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1c90: 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72 46  ine setAllPagerF
1ca0: 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d 6f  lags(X)  /* no-o
1cb0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
1cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75 6d  .** Return a hum
1cd0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d 65  an-readable name
1ce0: 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   for a constrain
1cf0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63 74  t resolution act
1d00: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
1d20: 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20 63  IGN_KEY.static c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69 6f  onst char *actio
1d40: 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e 29  nName(u8 action)
1d50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d60: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
1d70: 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 63   action ){.    c
1d80: 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a 20  ase OE_SetNull: 
1d90: 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e 55   zName = "SET NU
1da0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
1db0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53  k;.    case OE_S
1dc0: 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20 3d  etDflt:  zName =
1dd0: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b 20   "SET DEFAULT"; 
1de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1df0: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
1e00: 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41 44   zName = "CASCAD
1e10: 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  E";         brea
1e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  k;.    case OE_R
1e30: 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20 3d  estrict: zName =
1e40: 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20 20   "RESTRICT";    
1e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1e60: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1e70: 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43 54   zName = "NO ACT
1e80: 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20 20  ION";  .        
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ea0: 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f 45  sert( action==OE
1eb0: 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b 0a  _None ); break;.
1ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
1ed0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
1ee0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
1ef0: 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
1f00: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
1f10: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63 6f  URNALMODE_XXX co
1f20: 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69 6e  nstants.** defin
1f30: 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20 54  ed in pager.h. T
1f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f50: 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69 61  urns the associa
1f60: 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a 2a  ted lowercase.**
1f70: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e 61   journal-mode na
1f80: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
1f90: 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  r *sqlite3Journa
1fa0: 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65 4d  lModename(int eM
1fb0: 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ode){.  static c
1fc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d 6f  har * const azMo
1fd0: 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  deName[] = {.   
1fe0: 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72 73   "delete", "pers
1ff0: 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74 72  ist", "off", "tr
2000: 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72 79  uncate", "memory
2010: 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 2c  _OMIT_WAL.     ,
2030: 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20 20   "wal".#endif.  
2040: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  };.  assert( PAG
2050: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2060: 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61 73  ELETE==0 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3d  NALMODE_PERSIST=
2090: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b0: 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61 73  E_OFF==2 );.  as
20c0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20d0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20e0: 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
20f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2100: 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b 0a  DE_MEMORY==4 );.
2110: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3d  JOURNALMODE_WAL=
2130: 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
2140: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
2150: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
2160: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
2170: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
2180: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
2190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21a0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
21b0: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
21c0: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
21d0: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
21e0: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2200: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2210: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2220: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2230: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2240: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
2250: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
2260: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
2270: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
2280: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
2290: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
22c0: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
22d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
22e0: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
22f0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2300: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2310: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2320: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2330: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2340: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
2350: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
2360: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
2370: 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61 67  * Process a prag
2380: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  ma statement.  .
2390: 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72  **.** Pragmas ar
23a0: 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a  e of this form:.
23b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d  **.**      PRAGM
23c0: 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20 5b 3d  A [schema.]id [=
23d0: 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20 54 68   value].**.** Th
23e0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67  e identifier mig
23f0: 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72  ht also be a str
2400: 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ing.  The value 
2410: 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64  is a string, and
2420: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20  .** identifier, 
2430: 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  or a number.  If
2440: 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72   minusFlag is tr
2450: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ue, then the val
2460: 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65  ue is.** a numbe
2470: 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63 65  r that was prece
2480: 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73  ded by a minus s
2490: 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ign..**.** If th
24a0: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 22  e left side is "
24b0: 64 61 74 61 62 61 73 65 2e 69 64 22 20 74 68 65  database.id" the
24c0: 6e 20 70 49 64 31 20 69 73 20 74 68 65 20 64 61  n pId1 is the da
24d0: 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 61  tabase name.** a
24e0: 6e 64 20 70 49 64 32 20 69 73 20 74 68 65 20 69  nd pId2 is the i
24f0: 64 2e 20 20 49 66 20 74 68 65 20 6c 65 66 74 20  d.  If the left 
2500: 73 69 64 65 20 69 73 20 6a 75 73 74 20 22 69 64  side is just "id
2510: 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20 74  " then pId1 is t
2520: 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20 70 49 64  he.** id and pId
2530: 32 20 69 73 20 61 6e 79 20 65 6d 70 74 79 20 73  2 is any empty s
2540: 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tring..*/.void s
2550: 71 6c 69 74 65 33 50 72 61 67 6d 61 28 0a 20 20  qlite3Pragma(.  
2560: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
2570: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31 2c 20 20    Token *pId1,  
2580: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
2590: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
25a0: 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20 54 6f  id field */.  To
25b0: 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20 20 20 20  ken *pId2,      
25c0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
25d0: 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20   of [schema.]id 
25e0: 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  field, or NULL *
25f0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 75  /.  Token *pValu
2600: 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  e,      /* Token
2610: 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c 20 6f 72   for <value>, or
2620: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6d   NULL */.  int m
2630: 69 6e 75 73 46 6c 61 67 20 20 20 20 20 20 20 2f  inusFlag       /
2640: 2a 20 54 72 75 65 20 69 66 20 61 20 27 2d 27 20  * True if a '-' 
2650: 73 69 67 6e 20 70 72 65 63 65 64 65 64 20 3c 76  sign preceded <v
2660: 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20 20 63 68  alue> */.){.  ch
2670: 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 20 20  ar *zLeft = 0;  
2680: 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
2690: 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74 72  inated UTF-8 str
26a0: 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20 20 63 68  ing <id> */.  ch
26b0: 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 20  ar *zRight = 0; 
26c0: 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
26d0: 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74 72  inated UTF-8 str
26e0: 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20 6f 72 20  ing <value>, or 
26f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
2700: 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20  char *zDb = 0;  
2710: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2720: 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e   name */.  Token
2730: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
2740: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2750: 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  <id> token */.  
2760: 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b 34 5d 3b  char *aFcntl[4];
2770: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
2780: 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 43 4e  nt to SQLITE_FCN
2790: 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 69  TL_PRAGMA */.  i
27a0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
27b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
27c0: 65 20 69 6e 64 65 78 20 66 6f 72 20 3c 64 61 74  e index for <dat
27d0: 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69 6e 74 20  abase> */.  int 
27e0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75           /* retu
2800: 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d 20 53 51  rn value form SQ
2810: 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d  LITE_FCNTL_PRAGM
2820: 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  A */.  sqlite3 *
2830: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2840: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2850: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2860: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
2890: 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
28a0: 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20 20 56 64  pragmaed */.  Vd
28b0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
28c0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
28d0: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
28e0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
28f0: 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50  t PragmaName *pP
2900: 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54 68 65 20  ragma;   /* The 
2910: 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20 69 66 28  pragma */..  if(
2920: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
2930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e    sqlite3VdbeRun
2940: 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a 20 20 70  OnlyOnce(v);.  p
2950: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b  Parse->nMem = 2;
2960: 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74  ..  /* Interpret
2970: 20 74 68 65 20 5b 73 63 68 65 6d 61 2e 5d 20 70   the [schema.] p
2980: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
2990: 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 69 44 62  a statement. iDb
29a0: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   is the.  ** ind
29b0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
29c0: 73 65 20 74 68 69 73 20 70 72 61 67 6d 61 20 69  se this pragma i
29d0: 73 20 62 65 69 6e 67 20 61 70 70 6c 69 65 64 20  s being applied 
29e0: 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b 5d 2e 20  to in db.aDb[]. 
29f0: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
2a00: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
2a10: 61 72 73 65 2c 20 70 49 64 31 2c 20 70 49 64 32  arse, pId1, pId2
2a20: 2c 20 26 70 49 64 29 3b 0a 20 20 69 66 28 20 69  , &pId);.  if( i
2a30: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
2a40: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
2a50: 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  iDb];..  /* If t
2a60: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
2a70: 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63   has been explic
2a80: 69 74 6c 79 20 6e 61 6d 65 64 20 61 73 20 70 61  itly named as pa
2a90: 72 74 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  rt of the .  ** 
2aa0: 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20 73 75 72  pragma, make sur
2ab0: 65 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 0a 20  e it is open. . 
2ac0: 20 2a 2f 0a 20 20 69 66 28 20 69 44 62 3d 3d 31   */.  if( iDb==1
2ad0: 20 26 26 20 73 71 6c 69 74 65 33 4f 70 65 6e 54   && sqlite3OpenT
2ae0: 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 72  empDatabase(pPar
2af0: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
2b00: 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65 66 74 20  n;.  }..  zLeft 
2b10: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
2b20: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49 64 29 3b  mToken(db, pId);
2b30: 0a 20 20 69 66 28 20 21 7a 4c 65 66 74 20 29 20  .  if( !zLeft ) 
2b40: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 69  return;.  if( mi
2b50: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a  nusFlag ){.    z
2b60: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4d  Right = sqlite3M
2b70: 50 72 69 6e 74 66 28 64 62 2c 20 22 2d 25 54 22  Printf(db, "-%T"
2b80: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c  , pValue);.  }el
2b90: 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d  se{.    zRight =
2ba0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
2bb0: 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61 6c 75 65  Token(db, pValue
2bc0: 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2bd0: 28 20 70 49 64 32 20 29 3b 0a 20 20 7a 44 62 20  ( pId2 );.  zDb 
2be0: 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f 20 70 44  = pId2->n>0 ? pD
2bf0: 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a 20 30 3b  b->zDbSName : 0;
2c00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
2c10: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2c20: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 2c 20 7a  SQLITE_PRAGMA, z
2c30: 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c 20 7a 44  Left, zRight, zD
2c40: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70  b) ){.    goto p
2c50: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
2c60: 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20 53 51 4c    /* Send an SQL
2c70: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
2c80: 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 74 6f   file-control to
2c90: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2ca0: 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  VFS.  ** connect
2cb0: 69 6f 6e 2e 20 20 49 66 20 69 74 20 72 65 74 75  ion.  If it retu
2cc0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74  rns SQLITE_OK, t
2cd0: 68 65 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20  hen assume that 
2ce0: 74 68 65 20 56 46 53 0a 20 20 2a 2a 20 68 61 6e  the VFS.  ** han
2cf0: 64 6c 65 64 20 74 68 65 20 70 72 61 67 6d 61 20  dled the pragma 
2d00: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e  and generate a n
2d10: 6f 2d 6f 70 20 70 72 65 70 61 72 65 64 20 73 74  o-op prepared st
2d20: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  atement..  **.  
2d30: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
2d40: 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38 2d 35 35  N-OF: R-12238-55
2d50: 31 32 30 20 57 68 65 6e 65 76 65 72 20 61 20 50  120 Whenever a P
2d60: 52 41 47 4d 41 20 73 74 61 74 65 6d 65 6e 74 20  RAGMA statement 
2d70: 69 73 20 70 61 72 73 65 64 2c 0a 20 20 2a 2a 20  is parsed,.  ** 
2d80: 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  an SQLITE_FCNTL_
2d90: 50 52 41 47 4d 41 20 66 69 6c 65 20 63 6f 6e 74  PRAGMA file cont
2da0: 72 6f 6c 20 69 73 20 73 65 6e 74 20 74 6f 20 74  rol is sent to t
2db0: 68 65 20 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f  he open sqlite3_
2dc0: 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  file.  ** object
2dd0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2de0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2df0: 69 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ile to which the
2e00: 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20 73 74 61   pragma.  ** sta
2e10: 74 65 6d 65 6e 74 20 72 65 66 65 72 73 2e 0a 20  tement refers.. 
2e20: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2e30: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 39  NTATION-OF: R-29
2e40: 38 37 35 2d 33 31 36 37 38 20 54 68 65 20 61 72  875-31678 The ar
2e50: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 53 51  gument to the SQ
2e60: 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d  LITE_FCNTL_PRAGM
2e70: 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 74  A.  ** file cont
2e80: 72 6f 6c 20 69 73 20 61 6e 20 61 72 72 61 79 20  rol is an array 
2e90: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
2ea0: 74 72 69 6e 67 73 20 28 63 68 61 72 2a 2a 29 20  trings (char**) 
2eb0: 69 6e 20 77 68 69 63 68 20 74 68 65 0a 20 20 2a  in which the.  *
2ec0: 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  * second element
2ed0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
2ee0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2ef0: 20 70 72 61 67 6d 61 20 61 6e 64 20 74 68 65 20   pragma and the 
2f00: 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c 65 6d 65  third.  ** eleme
2f10: 6e 74 20 69 73 20 74 68 65 20 61 72 67 75 6d 65  nt is the argume
2f20: 6e 74 20 74 6f 20 74 68 65 20 70 72 61 67 6d 61  nt to the pragma
2f30: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
2f40: 70 72 61 67 6d 61 20 68 61 73 20 6e 6f 0a 20 20  pragma has no.  
2f50: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 2a  ** argument..  *
2f60: 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d 20 3d 20  /.  aFcntl[0] = 
2f70: 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31 5d 20 3d  0;.  aFcntl[1] =
2f80: 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63 6e 74 6c   zLeft;.  aFcntl
2f90: 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b 0a 20 20  [2] = zRight;.  
2fa0: 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30 3b 0a 20  aFcntl[3] = 0;. 
2fb0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
2fc0: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 72 63  .nBusy = 0;.  rc
2fd0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
2fe0: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
2ff0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
3000: 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29 61 46 63  AGMA, (void*)aFc
3010: 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ntl);.  if( rc==
3020: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3030: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
3040: 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20  umCols(v, 1);.  
3050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
3060: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f  ColName(v, 0, CO
3070: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61 46 63 6e  LNAME_NAME, aFcn
3080: 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45 5f 54 52  tl[0], SQLITE_TR
3090: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 72 65  ANSIENT);.    re
30a0: 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76  turnSingleText(v
30b0: 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  , aFcntl[0]);.  
30c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
30d0: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 67  Fcntl[0]);.    g
30e0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
30f0: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
3100: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
3110: 0a 20 20 20 20 69 66 28 20 61 46 63 6e 74 6c 5b  .    if( aFcntl[
3120: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
3130: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3140: 73 65 2c 20 22 25 73 22 2c 20 61 46 63 6e 74 6c  se, "%s", aFcntl
3150: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [0]);.      sqli
3160: 74 65 33 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b  te3_free(aFcntl[
3170: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
3180: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
3190: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
31a0: 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61  rc;.    goto pra
31b0: 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  gma_out;.  }..  
31c0: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 70 72  /* Locate the pr
31d0: 61 67 6d 61 20 69 6e 20 74 68 65 20 6c 6f 6f 6b  agma in the look
31e0: 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 50  up table */.  pP
31f0: 72 61 67 6d 61 20 3d 20 70 72 61 67 6d 61 4c 6f  ragma = pragmaLo
3200: 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69  cate(zLeft);.  i
3210: 66 28 20 70 50 72 61 67 6d 61 3d 3d 30 20 29 20  f( pPragma==0 ) 
3220: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
3230: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
3240: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
3250: 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 20 69  hema is loaded i
3260: 66 20 74 68 65 20 70 72 61 67 6d 61 20 72 65 71  f the pragma req
3270: 75 69 72 65 73 20 74 68 61 74 20 2a 2f 0a 20 20  uires that */.  
3280: 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50  if( (pPragma->mP
3290: 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
32a0: 5f 4e 65 65 64 53 63 68 65 6d 61 29 21 3d 30 20  _NeedSchema)!=0 
32b0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
32c0: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
32d0: 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67  rse) ) goto prag
32e0: 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ma_out;.  }..  /
32f0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 72  * Register the r
3300: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
3310: 65 73 20 66 6f 72 20 70 72 61 67 6d 61 73 20 74  es for pragmas t
3320: 68 61 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c  hat return resul
3330: 74 73 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72  ts */.  if( (pPr
3340: 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26  agma->mPragFlg &
3350: 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d   PragFlg_NoColum
3360: 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26 20 28 28  ns)==0 .   && ((
3370: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3380: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3390: 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a 52  lumns1)==0 || zR
33a0: 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  ight==0).  ){.  
33b0: 20 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c    setPragmaResul
33c0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20  tColumnNames(v, 
33d0: 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a 20  pPragma);.  }.. 
33e0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
33f0: 61 70 70 72 6f 70 72 69 61 74 65 20 70 72 61 67  appropriate prag
3400: 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  ma handler */.  
3410: 73 77 69 74 63 68 28 20 70 50 72 61 67 6d 61 2d  switch( pPragma-
3420: 3e 65 50 72 61 67 54 79 70 20 29 7b 0a 20 20 0a  >ePragTyp ){.  .
3430: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
3440: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
3450: 52 41 47 4d 41 53 29 20 26 26 20 21 64 65 66 69  RAGMAS) && !defi
3460: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3470: 44 45 50 52 45 43 41 54 45 44 29 0a 20 20 2f 2a  DEPRECATED).  /*
3480: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
3490: 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63  chema.]default_c
34a0: 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20  ache_size.  **  
34b0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
34c0: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
34d0: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
34e0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
34f0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
3500: 74 20 70 65 72 73 69 73 74 65 6e 74 20 73 65 74  t persistent set
3510: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
3520: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
3530: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65  e.  The value re
3540: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61  turned is the ma
3550: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
3560: 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68    ** pages in th
3570: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54  e page cache.  T
3580: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73  he second form s
3590: 65 74 73 20 62 6f 74 68 20 74 68 65 20 63 75 72  ets both the cur
35a0: 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63  rent.  ** page c
35b0: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20  ache size value 
35c0: 61 6e 64 20 74 68 65 20 70 65 72 73 69 73 74 65  and the persiste
35d0: 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 73 69  nt page cache si
35e0: 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74  ze value.  ** st
35f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
3600: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a  base file..  **.
3610: 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73 69    ** Older versi
3620: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 6f  ons of SQLite wo
3630: 75 6c 64 20 73 65 74 20 74 68 65 20 64 65 66 61  uld set the defa
3640: 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20 74  ult cache size t
3650: 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69 76  o a.  ** negativ
3660: 65 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64 69  e number to indi
3670: 63 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  cate synchronous
3680: 3d 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61 79  =OFF.  These day
3690: 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  s, synchronous. 
36a0: 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f 6e   ** is always on
36b0: 20 62 79 20 64 65 66 61 75 6c 74 20 72 65 67 61   by default rega
36c0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 69  rdless of the si
36d0: 67 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  gn of the defaul
36e0: 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a  t cache.  ** siz
36f0: 65 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75 65  e.  But continue
3700: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62 73   to take the abs
3710: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
3720: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
3730: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68 69  .  ** size of hi
3740: 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
3750: 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20 63  bility..  */.  c
3760: 61 73 65 20 50 72 61 67 54 79 70 5f 44 45 46 41  ase PragTyp_DEFA
3770: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20  ULT_CACHE_SIZE: 
3780: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
3790: 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42  st int iLn = VDB
37a0: 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28  E_OFFSET_LINENO(
37b0: 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  2);.    static c
37c0: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
37d0: 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d  getCacheSize[] =
37e0: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54 72   {.      { OP_Tr
37f0: 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  ansaction, 0, 0,
3800: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20          0},     
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
3830: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
3840: 65 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20  e,  0, 1,       
3850: 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43   BTREE_DEFAULT_C
3860: 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a 20  ACHE_SIZE},  /* 
3870: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
3880: 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20  IfPos,       1, 
3890: 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  8,        0},.  
38a0: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
38b0: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
38c0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
38d0: 50 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20 31  P_Subtract,    1
38e0: 2c 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c 0a  , 2,        1},.
38f0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73        { OP_IfPos
3900: 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20  ,       1, 8,   
3910: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
3920: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
3930: 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   0, 1,        0}
3940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20 2a            /* 6 *
3960: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f 6f  /.      { OP_Noo
3970: 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  p,        0, 0, 
3980: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
3990: 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c   { OP_ResultRow,
39a0: 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20     1, 1,        
39b0: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56  0},.    };.    V
39c0: 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20  dbeOp *aOp;.    
39d0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
39e0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
39f0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
3a00: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
3a10: 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  Mem += 2;.      
3a20: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
3a30: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
3a40: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  d(v, ArraySize(g
3a50: 65 74 43 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  etCacheSize));. 
3a60: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
3a70: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3a80: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74  v, ArraySize(get
3a90: 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43  CacheSize), getC
3aa0: 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29 3b 0a  acheSize, iLn);.
3ab0: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
3ac0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
3ad0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
3ae0: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70  ;.      aOp[0].p
3af0: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
3b00: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
3b10: 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31 20        aOp[6].p1 
3b20: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
3b30: 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20 20 20  _CACHE_SIZE;.   
3b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
3b50: 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  t size = sqlite3
3b60: 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33  AbsInt32(sqlite3
3b70: 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
3b80: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
3b90: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
3ba0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
3bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3bc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
3bd0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
3be0: 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  TREE_DEFAULT_CAC
3bf0: 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29 3b 0a  HE_SIZE, size);.
3c00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
3c10: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3c20: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
3c30: 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70   );.      pDb->p
3c40: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
3c50: 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20  ze = size;.     
3c60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
3c70: 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e 70  CacheSize(pDb->p
3c80: 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  Bt, pDb->pSchema
3c90: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
3ca0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
3cb0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53    }.#endif /* !S
3cc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
3cd0: 5f 50 52 41 47 4d 41 53 20 26 26 20 21 53 51 4c  _PRAGMAS && !SQL
3ce0: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
3cf0: 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  TED */..#if !def
3d00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3d10: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 0a  _PAGER_PRAGMAS).
3d20: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
3d30: 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f  A [schema.]page_
3d40: 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  PRAGM
3d50: 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f  A [schema.]page_
3d60: 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  size=N.  **.  **
3d70: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
3d80: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
3d90: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
3da0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
3db0: 65 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 62  e page size in b
3dc0: 79 74 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e  ytes.  The secon
3dd0: 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65 0a  d form sets the.
3de0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
3df0: 67 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20  ge size value.  
3e00: 54 68 65 20 76 61 6c 75 65 20 63 61 6e 20 6f 6e  The value can on
3e10: 6c 79 20 62 65 20 73 65 74 20 69 66 0a 20 20 2a  ly be set if.  *
3e20: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  * the database h
3e30: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
3e40: 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
3e50: 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 47  case PragTyp_PAG
3e60: 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 42 74  E_SIZE: {.    Bt
3e70: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
3e80: 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
3e90: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
3ea0: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
3eb0: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 41      int size = A
3ec0: 4c 57 41 59 53 28 70 42 74 29 20 3f 20 73 71 6c  LWAYS(pBt) ? sql
3ed0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
3ee0: 53 69 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a 20  Size(pBt) : 0;. 
3ef0: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
3f00: 65 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b 0a 20  eInt(v, size);. 
3f10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3f20: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66 61  /* Malloc may fa
3f30: 69 6c 20 77 68 65 6e 20 73 65 74 74 69 6e 67 20  il when setting 
3f40: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  the page-size, a
3f50: 73 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  s there is an in
3f60: 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ternal.      ** 
3f70: 62 75 66 66 65 72 20 74 68 61 74 20 74 68 65 20  buffer that the 
3f80: 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 72 65 73  pager module res
3f90: 69 7a 65 73 20 75 73 69 6e 67 20 73 71 6c 69 74  izes using sqlit
3fa0: 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20 20  e3_realloc()..  
3fb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d      */.      db-
3fc0: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
3fd0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
3fe0: 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  ht);.      if( S
3ff0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c  QLITE_NOMEM==sql
4000: 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
4010: 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65  Size(pBt, db->ne
4020: 78 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30 29  xtPagesize,-1,0)
4030: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4040: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
4050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
4070: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
4080: 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72 65   [schema.]secure
4090: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20 50 52  _delete.  **  PR
40a0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65  AGMA [schema.]se
40b0: 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f  cure_delete=ON/O
40c0: 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  FF.  **.  ** The
40d0: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
40e0: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
40f0: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
4100: 20 20 2a 2a 20 73 65 63 75 72 65 5f 64 65 6c 65    ** secure_dele
4110: 74 65 20 66 6c 61 67 2e 20 20 54 68 65 20 73 65  te flag.  The se
4120: 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65  cond form change
4130: 73 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  s the secure_del
4140: 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67 20 73 65  ete.  ** flag se
4150: 74 74 69 6e 67 20 61 6e 64 20 72 65 70 6f 72 74  tting and report
4160: 73 20 74 68 65 6e 65 77 20 76 61 6c 75 65 2e 0a  s thenew value..
4170: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4180: 54 79 70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  Typ_SECURE_DELET
4190: 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  E: {.    Btree *
41a0: 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a  pBt = pDb->pBt;.
41b0: 20 20 20 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a      int b = -1;.
41c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21      assert( pBt!
41d0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  =0 );.    if( zR
41e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 62 20  ight ){.      b 
41f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  = sqlite3GetBool
4200: 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 3b 0a  ean(zRight, 0);.
4210: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
4220: 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30  d2->n==0 && b>=0
4230: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
4240: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
4250: 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
4260: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
4270: 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
4280: 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 69 69  elete(db->aDb[ii
4290: 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20 20 20  ].pBt, b);.     
42a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 20 3d   }.    }.    b =
42b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
42c0: 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c 20 62  ureDelete(pBt, b
42d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e  );.    returnSin
42e0: 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a 20 20  gleInt(v, b);.  
42f0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4300: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
4310: 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67  [schema.]max_pag
4320: 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50 52  e_count.  **  PR
4330: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61  AGMA [schema.]ma
4340: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e 0a 20  x_page_count=N. 
4350: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
4360: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
4370: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4380: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
4390: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
43a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
43b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
43c0: 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f 6e 64  The .  ** second
43d0: 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73 20 74   form attempts t
43e0: 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20 73 65  o change this se
43f0: 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20 20 2a  tting.  Both.  *
4400: 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e 20 74  * forms return t
4410: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
4420: 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ng..  **.  ** Th
4430: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
4440: 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e 20 20   of N is used.  
4450: 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65  This is undocume
4460: 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74 0a 20  nted and might. 
4470: 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 65   ** change.  The
4480: 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73   only purpose is
4490: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65   to provide an e
44a0: 61 73 79 20 77 61 79 20 74 6f 20 74 65 73 74 0a  asy way to test.
44b0: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
44c0: 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e 63 74  AbsInt32() funct
44d0: 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ion..  **.  **  
44e0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
44f0: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a  page_count.  **.
4500: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
4510: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
4520: 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
4530: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
4540: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50    case PragTyp_P
4550: 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20  AGE_COUNT: {.   
4560: 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20 20 73   int iReg;.    s
4570: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
4580: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
4590: 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  Db);.    iReg = 
45a0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
45b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
45c0: 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29  olower(zLeft[0])
45d0: 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20 73  =='p' ){.      s
45e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
45f0: 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74  (v, OP_Pagecount
4600: 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a 20 20  , iDb, iReg);.  
4610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
4620: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4630: 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74 2c  (v, OP_MaxPgcnt,
4640: 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20 20 20   iDb, iReg, .   
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 73 49       sqlite3AbsI
4670: 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69  nt32(sqlite3Atoi
4680: 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20 20 20  (zRight)));.    
4690: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
46a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
46b0: 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20 31  sultRow, iReg, 1
46c0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
46d0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
46e0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f  AGMA [schema.]lo
46f0: 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20  cking_mode.  ** 
4700: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4710: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20  ]locking_mode = 
4720: 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69 76  (normal|exclusiv
4730: 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e).  */.  case P
4740: 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f 4d  ragTyp_LOCKING_M
4750: 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ODE: {.    const
4760: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 22 6e   char *zRet = "n
4770: 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74 20  ormal";.    int 
4780: 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b 69  eMode = getLocki
4790: 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b 0a  ngMode(zRight);.
47a0: 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e  .    if( pId2->n
47b0: 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41  ==0 && eMode==PA
47c0: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
47d0: 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20 20 2f  QUERY ){.      /
47e0: 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47 4d 41  * Simple "PRAGMA
47f0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22 20   locking_mode;" 
4800: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
4810: 69 73 20 61 20 71 75 65 72 79 20 66 6f 72 0a 20  is a query for. 
4820: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
4830: 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  ent default lock
4840: 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63 68 20  ing mode (which 
4850: 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
4860: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
4870: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f 66   locking-mode of
4880: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
4890: 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  se)..      */.  
48a0: 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d 3e      eMode = db->
48b0: 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20 20  dfltLockMode;.  
48c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
48d0: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
48e0: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d      if( pId2->n=
48f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
4900: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
4910: 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61 73 65  that no database
4920: 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63 69 66   name was specif
4930: 69 65 64 20 61 73 20 70 61 72 74 0a 20 20 20 20  ied as part.    
4940: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 52      ** of the PR
4950: 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e  AGMA command. In
4960: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6c   this case the l
4970: 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73 74  ocking-mode must
4980: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
4990: 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63 68  et on all attach
49a0: 65 64 20 64 61 74 61 62 61 73 65 73 2c 20 61 73  ed databases, as
49b0: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d 61 69   well as the mai
49c0: 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20 20 20  n db file..     
49d0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
49e0: 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69 74   Also, the sqlit
49f0: 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  e3.dfltLockMode 
4a00: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
4a10: 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  so that.        
4a20: 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e  ** any subsequen
4a30: 74 6c 79 20 61 74 74 61 63 68 65 64 20 64 61 74  tly attached dat
4a40: 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73 65 20  abases also use 
4a50: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 20 20  the specified.  
4a60: 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67        ** locking
4a70: 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a   mode..        *
4a80: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  /.        int ii
4a90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
4aa0: 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b 30  (pDb==&db->aDb[0
4ab0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
4ac0: 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44 62  ii=2; ii<db->nDb
4ad0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
4ae0: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4af0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
4b00: 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b 0a  ->aDb[ii].pBt);.
4b10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4b20: 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
4b30: 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65 29  e(pPager, eMode)
4b40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4b50: 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b      db->dfltLock
4b60: 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
4b70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4b80: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
4b90: 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e  BtreePager(pDb->
4ba0: 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f 64  pBt);.      eMod
4bb0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
4bc0: 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61 67  LockingMode(pPag
4bd0: 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  er, eMode);.    
4be0: 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  }..    assert( e
4bf0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4c00: 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
4c10: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
4c20: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4c30: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4c40: 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64   );.    if( eMod
4c50: 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
4c60: 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
4c70: 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 22  {.      zRet = "
4c80: 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20 20 20  exclusive";.    
4c90: 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
4ca0: 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74 29 3b  leText(v, zRet);
4cb0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4cc0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4cd0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72  MA [schema.]jour
4ce0: 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50  nal_mode.  **  P
4cf0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4d00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a 20 20  ournal_mode =.  
4d10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
4d20: 20 20 20 20 20 20 20 20 28 64 65 6c 65 74 65 7c          (delete|
4d30: 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72 75 6e  persist|off|trun
4d40: 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61 6c 7c  cate|memory|wal|
4d50: 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  off).  */.  case
4d60: 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c   PragTyp_JOURNAL
4d70: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69 6e 74  _MODE: {.    int
4d80: 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 2f   eMode;        /
4d90: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47  * One of the PAG
4da0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58  ER_JOURNALMODE_X
4db0: 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  XX symbols */.  
4dc0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
4dd0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
4de0: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ter */..    if( 
4df0: 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  zRight==0 ){.   
4e00: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4e10: 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72  s no "=MODE" par
4e20: 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 2c  t of the pragma,
4e30: 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f 72 20   do a query for 
4e40: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  the.      ** cur
4e50: 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  rent mode */.   
4e60: 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52     eMode = PAGER
4e70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
4e80: 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  RY;.    }else{. 
4e90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4ea0: 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e  *zMode;.      in
4eb0: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
4ec0: 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a 20  len30(zRight);. 
4ed0: 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30       for(eMode=0
4ee0: 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74  ; (zMode = sqlit
4ef0: 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d  e3JournalModenam
4f00: 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d  e(eMode))!=0; eM
4f10: 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ode++){.        
4f20: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
4f30: 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64  Cmp(zRight, zMod
4f40: 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b  e, n)==0 ) break
4f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f60: 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20  if( !zMode ){.  
4f70: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
4f80: 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64 6f 65  "=MODE" part doe
4f90: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
4fa0: 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f  known journal mo
4fb0: 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  de,.        ** t
4fc0: 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79 20 2a  hen do a query *
4fd0: 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  /.        eMode 
4fe0: 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
4ff0: 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20 20 20  ODE_QUERY;.     
5000: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5010: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
5020: 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20  URNALMODE_QUERY 
5030: 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b  && pId2->n==0 ){
5040: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
5050: 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  t "PRAGMA journa
5060: 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50 52  l_mode" into "PR
5070: 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61  AGMA main.journa
5080: 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20  l_mode" */.     
5090: 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20   iDb = 0;.      
50a0: 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20  pId2->n = 1;.   
50b0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 64 62   }.    for(ii=db
50c0: 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20  ->nDb-1; ii>=0; 
50d0: 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  ii--){.      if(
50e0: 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74   db->aDb[ii].pBt
50f0: 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20   && (ii==iDb || 
5100: 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20  pId2->n==0) ){. 
5110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5120: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
5130: 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i);.        sqli
5140: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5150: 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 2c   OP_JournalMode,
5160: 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b 0a   ii, 1, eMode);.
5170: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5190: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
51a0: 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  Row, 1, 1);.    
51b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
51c0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
51d0: 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73  chema.]journal_s
51e0: 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20  ize_limit.  **  
51f0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
5200: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d  journal_size_lim
5210: 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47  it=N.  **.  ** G
5220: 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 73 69  et or set the si
5230: 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c  ze limit on roll
5240: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
5250: 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  es..  */.  case 
5260: 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f  PragTyp_JOURNAL_
5270: 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20  SIZE_LIMIT: {.  
5280: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
5290: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
52a0: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
52b0: 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20     i64 iLimit = 
52c0: 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  -2;.    if( zRig
52d0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
52e0: 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
52f0: 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74  (zRight, &iLimit
5300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69  );.      if( iLi
5310: 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20  mit<-1 ) iLimit 
5320: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
5330: 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  iLimit = sqlite3
5340: 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65  PagerJournalSize
5350: 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20 69 4c  Limit(pPager, iL
5360: 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72  imit);.    retur
5370: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 69 4c  nSingleInt(v, iL
5380: 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  imit);.    break
5390: 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.  }..#endif /*
53a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
53b0: 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 20  ER_PRAGMAS */.. 
53c0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
53d0: 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76   [schema.]auto_v
53e0: 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47  acuum.  **  PRAG
53f0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f  MA [schema.]auto
5400: 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20  _vacuum=N.  **. 
5410: 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74   ** Get or set t
5420: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
5430: 64 61 74 61 62 61 73 65 20 27 61 75 74 6f 2d 76  database 'auto-v
5440: 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74 65 72  acuum' parameter
5450: 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
5460: 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e   is one of:  0 N
5470: 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49 4e 43  ONE 1 FULL 2 INC
5480: 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69  REMENTAL.  */.#i
5490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
54a0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63  T_AUTOVACUUM.  c
54b0: 61 73 65 20 50 72 61 67 54 79 70 5f 41 55 54 4f  ase PragTyp_AUTO
54c0: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42  _VACUUM: {.    B
54d0: 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d  tree *pBt = pDb-
54e0: 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
54f0: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20  ( pBt!=0 );.    
5500: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
5510: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
5520: 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 42  eInt(v, sqlite3B
5530: 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
5540: 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c  m(pBt));.    }el
5550: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 41  se{.      int eA
5560: 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56 61 63  uto = getAutoVac
5570: 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  uum(zRight);.   
5580: 20 20 20 61 73 73 65 72 74 28 20 65 41 75 74 6f     assert( eAuto
5590: 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d 32 20  >=0 && eAuto<=2 
55a0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78  );.      db->nex
55b0: 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38 29 65  tAutovac = (u8)e
55c0: 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43  Auto;.      /* C
55d0: 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63 75 75  all SetAutoVacuu
55e0: 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69 74 69  m() to set initi
55f0: 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65 72 6e  alize the intern
5600: 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20 20 20  al auto and.    
5610: 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d    ** incr-vacuum
5620: 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69 73 20   flags. This is 
5630: 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65  required in case
5640: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
5650: 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65  .      ** create
5660: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
5670: 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72  ile. It is impor
5680: 74 61 6e 74 20 74 68 61 74 20 69 74 20 69 73 20  tant that it is 
5690: 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  created.      **
56a0: 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   as an auto-vacu
56b0: 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e 0a 20  um capable db.. 
56c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
56d0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
56e0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74  etAutoVacuum(pBt
56f0: 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20 20 20  , eAuto);.      
5700: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5710: 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c  K && (eAuto==1 |
5720: 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20  | eAuto==2) ){. 
5730: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 73         /* When s
5740: 65 74 74 69 6e 67 20 74 68 65 20 61 75 74 6f 5f  etting the auto_
5750: 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65  vacuum mode to e
5760: 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f 72 20  ither "full" or 
5770: 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69 6e 63  .        ** "inc
5780: 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74 65  remental", write
5790: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
57a0: 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64 61 74  ta[6] in the dat
57b0: 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  abase.        **
57c0: 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20 77 72   file. Before wr
57d0: 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d  iting to meta[6]
57e0: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d 65 74  , check that met
57f0: 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73 0a 20  a[3] indicates. 
5800: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74         ** that t
5810: 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  his really is an
5820: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
5830: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 20  able database.. 
5840: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
5850: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
5860: 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46  nt iLn = VDBE_OF
5870: 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a  FSET_LINENO(2);.
5880: 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
5890: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
58a0: 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20  setMeta6[] = {. 
58b0: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72           { OP_Tr
58c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c  ansaction,    0,
58d0: 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20           1,     
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20              0}, 
58f0: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
5900: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
5910: 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20 20 20  okie,     0,    
5920: 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20       1,         
5930: 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f  BTREE_LARGEST_RO
5940: 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20 20  OT_PAGE},.      
5950: 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20      { OP_If,    
5960: 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20           1,     
5970: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
5980: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
5990: 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   2 */.          
59a0: 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20  { OP_Halt,      
59b0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20       SQLITE_OK, 
59c0: 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20 20 20  OE_Abort,       
59d0: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a     0},    /* 3 *
59e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  /.          { OP
59f0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20  _SetCookie,     
5a00: 20 30 2c 20 20 20 20 20 20 20 20 20 42 54 52 45   0,         BTRE
5a10: 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c 20 30  E_INCR_VACUUM, 0
5a20: 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20  },    /* 4 */.  
5a30: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20        };.       
5a40: 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20   VdbeOp *aOp;.  
5a50: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
5a60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5a70: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
5a80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5a90: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
5aa0: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
5ab0: 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29 3b 0a  ize(setMeta6));.
5ac0: 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71          aOp = sq
5ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
5ae0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
5af0: 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74 4d 65  setMeta6), setMe
5b00: 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20  ta6, iLn);.     
5b10: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
5b20: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
5b30: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
5b40: 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31         aOp[0].p1
5b50: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20   = iDb;.        
5b60: 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[1].p1 = iDb;
5b70: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
5b80: 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a 20 20  p2 = iAddr+4;.  
5b90: 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70 31 20        aOp[4].p1 
5ba0: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61  = iDb;.        a
5bb0: 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75 74 6f  Op[4].p3 = eAuto
5bc0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   - 1;.        sq
5bd0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
5be0: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
5bf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
5c00: 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  eak;.  }.#endif.
5c10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
5c20: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e 63 72  MA [schema.]incr
5c30: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 4e  emental_vacuum(N
5c40: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 4e  ).  **.  ** Do N
5c50: 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72 65 6d   steps of increm
5c60: 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e 67 20  ental vacuuming 
5c70: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e 0a 20  on a database.. 
5c80: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
5c90: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
5ca0: 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  UM.  case PragTy
5cb0: 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56 41  p_INCREMENTAL_VA
5cc0: 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e 74 20  CUUM: {.    int 
5cd0: 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a 20 20  iLimit, addr;.  
5ce0: 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d 30 20    if( zRight==0 
5cf0: 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74 49 6e  || !sqlite3GetIn
5d00: 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  t32(zRight, &iLi
5d10: 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74 3c 3d  mit) || iLimit<=
5d20: 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69  0 ){.      iLimi
5d30: 74 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a  t = 0x7fffffff;.
5d40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5d50: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
5d60: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
5d70: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
5d80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5d90: 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69 6d 69  P_Integer, iLimi
5da0: 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20  t, 1);.    addr 
5db0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5dc0: 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72 56 61  Op1(v, OP_IncrVa
5dd0: 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64 62 65  cuum, iDb); Vdbe
5de0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
5df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e00: 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p1(v, OP_ResultR
5e10: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  ow, 1);.    sqli
5e20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5e30: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d   OP_AddImm, 1, -
5e40: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5e50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5e60: 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72 29 3b  IfPos, 1, addr);
5e70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5e80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5e90: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5ea0: 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  r);.    break;. 
5eb0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   }.#endif..#ifnd
5ec0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
5ed0: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 2f  AGER_PRAGMAS.  /
5ee0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
5ef0: 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69  schema.]cache_si
5f00: 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
5f10: 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73  [schema.]cache_s
5f20: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
5f30: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
5f40: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
5f50: 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67  nt local setting
5f60: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61   for the.  ** pa
5f70: 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 54  ge cache size. T
5f80: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73  he second form s
5f90: 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20  ets the local.  
5fa0: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
5fb0: 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20 4e 20  ze value.  If N 
5fc0: 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e  is positive then
5fd0: 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a   that is the.  *
5fe0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
5ff0: 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20  s in the cache. 
6000: 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76   If N is negativ
6010: 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
6020: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6030: 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20   is adjusted so 
6040: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75  that the cache u
6050: 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73  ses -N kibibytes
6060: 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e  .  ** of memory.
6070: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
6080: 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a  gTyp_CACHE_SIZE:
6090: 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   {.    assert( s
60a0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
60b0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
60c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  ) );.    if( !zR
60d0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
60e0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
60f0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
6100: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
6110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
6120: 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41   size = sqlite3A
6130: 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
6140: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
6150: 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69  >cache_size = si
6160: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
6170: 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
6180: 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62  ze(pDb->pBt, pDb
6190: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
61a0: 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
61b0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
61c0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
61d0: 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73  [schema.]cache_s
61e0: 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41 47 4d  pill.  **  PRAGM
61f0: 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f  A cache_spill=BO
6200: 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52 41 47  OLEAN.  **  PRAG
6210: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6220: 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20  e_spill=N.  **. 
6230: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
6240: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
6250: 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74  urrent local set
6260: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
6270: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 70 69  * page cache spi
6280: 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73 65 63  ll size. The sec
6290: 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73 20 63  ond form turns c
62a0: 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a 20 20  ache spill on.  
62b0: 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68 65 6e  ** or off.  When
62c0: 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68 65 20   turnning cache 
62d0: 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20 73 69  spill on, the si
62e0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
62f0: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 63 61  .  ** current ca
6300: 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65 20 74  che_size.  The t
6310: 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73 20 61  hird form sets a
6320: 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68 61 74   spill size that
6330: 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64 69 66  .  ** may be dif
6340: 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68 65 20  ferent form the 
6350: 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 2a 2a  cache size..  **
6360: 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74 69 76   If N is positiv
6370: 65 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 74  e then that is t
6380: 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  he.  ** number o
6390: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
63a0: 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73 20 6e  ache.  If N is n
63b0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
63c0: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
63d0: 20 70 61 67 65 73 20 69 73 20 61 64 6a 75 73 74   pages is adjust
63e0: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ed so that the c
63f0: 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b 69 62  ache uses -N kib
6400: 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d  ibytes.  ** of m
6410: 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  emory..  **.  **
6420: 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
6430: 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20 70 61  f cache_spill pa
6440: 67 65 73 20 69 73 20 6c 65 73 73 20 74 68 65 6e  ges is less then
6450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
6460: 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65 20 70   ** cache_size p
6470: 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c 69 6e  ages, no spillin
6480: 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c 20 74  g occurs until t
6490: 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20 65 78  he page count ex
64a0: 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65 20 6e  ceeds.  ** the n
64b0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 5f 73  umber of cache_s
64c0: 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a 2a 0a  ize pages..  **.
64d0: 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65 5f 73    ** The cache_s
64e0: 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65 74  pill=BOOLEAN set
64f0: 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74 6f 20  ting applies to 
6500: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73 63 68  all attached sch
6510: 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 6a  emas,.  ** not j
6520: 75 73 74 20 74 68 65 20 73 63 68 65 6d 61 20 73  ust the schema s
6530: 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  pecified..  */. 
6540: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41   case PragTyp_CA
6550: 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20  CHE_SPILL: {.   
6560: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6570: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
6580: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
6590: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
65a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
65b0: 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20 20 20  ngleInt(v,.     
65c0: 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 20 26      (db->flags &
65d0: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
65e0: 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a 20 20  ll)==0 ? 0 : .  
65f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6600: 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69  3BtreeSetSpillSi
6610: 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29 29 3b  ze(pDb->pBt,0));
6620: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6630: 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31 3b 0a    int size = 1;.
6640: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6650: 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74  3GetInt32(zRight
6660: 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20 20 20  , &size) ){.    
6670: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6680: 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44 62  SetSpillSize(pDb
6690: 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20  ->pBt, size);.  
66a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
66b0: 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
66c0: 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65 21 3d  n(zRight, size!=
66d0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62  0) ){.        db
66e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
66f0: 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20  E_CacheSpill;.  
6700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6710: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
6720: 7e 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69  ~SQLITE_CacheSpi
6730: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
6740: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
6750: 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  gs(db);.    }.  
6760: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6770: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
6780: 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69  [schema.]mmap_si
6790: 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ze(N).  **.  ** 
67a0: 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70  Used to set mapp
67b0: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20  ing size limit. 
67c0: 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  The mapping size
67d0: 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75   limit is.  ** u
67e0: 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  sed to limit the
67f0: 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20   aggregate size 
6800: 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61  of all memory ma
6810: 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20  pped regions of 
6820: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
6830: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20  e file. If this 
6840: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
6850: 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d   to zero, then m
6860: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20  emory mapping.  
6870: 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61  ** is not used a
6880: 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20  t all.  If N is 
6890: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
68a0: 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72  he default memor
68b0: 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74  y map.  ** limit
68c0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73   determined by s
68d0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
68e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
68f0: 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20  _SIZE) is set.. 
6900: 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65   ** The paramete
6910: 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20  r N is measured 
6920: 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20  in bytes..  **. 
6930: 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69   ** This value i
6940: 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65  s advisory.  The
6950: 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20   underlying VFS 
6960: 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72  is free to memor
6970: 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69  y map.  ** as li
6980: 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20  ttle or as much 
6990: 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78  as it wants.  Ex
69a0: 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65  cept, if N is se
69b0: 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a  t to 0 then the.
69c0: 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72    ** upper layer
69d0: 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76  s will never inv
69e0: 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69  oke the xFetch i
69f0: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65  nterfaces to the
6a00: 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   VFS..  */.  cas
6a10: 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53  e PragTyp_MMAP_S
6a20: 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  IZE: {.    sqlit
6a30: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66  e3_int64 sz;.#if
6a40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6a50: 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65  _SIZE>0.    asse
6a60: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6a70: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6a80: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6a90: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
6aa0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
6ab0: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
6ac0: 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a  oI64(zRight, &sz
6ad0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c  );.      if( sz<
6ae0: 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33  0 ) sz = sqlite3
6af0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
6b00: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  map;.      if( p
6b10: 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e  Id2->n==0 ) db->
6b20: 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20  szMmap = sz;.   
6b30: 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44     for(ii=db->nD
6b40: 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d  b-1; ii>=0; ii--
6b50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  ){.        if( d
6b60: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26  b->aDb[ii].pBt &
6b70: 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49  & (ii==iDb || pI
6b80: 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  d2->n==0) ){.   
6b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6ba0: 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
6bb0: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
6bc0: 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz);.        }.
6bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6be0: 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72    sz = -1;.    r
6bf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
6c00: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
6c10: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
6c20: 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
6c30: 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30  #else.    sz = 0
6c40: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
6c50: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E_OK;.#endif.   
6c60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6c70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
6c80: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
6c90: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  z);.    }else if
6ca0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc!=SQLITE_NOT
6cb0: 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70  FOUND ){.      p
6cc0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6cd0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
6ce0: 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = rc;.    }.    
6cf0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6d00: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
6d10: 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20  emp_store.  **  
6d20: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
6d30: 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22  re = "default"|"
6d40: 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20  memory"|"file". 
6d50: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
6d60: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
6d70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
6d80: 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20  mp_store flag.  
6d90: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
6da0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
6db0: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
6dc0: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
6dd0: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66  file and the def
6de0: 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20  ault.  ** value 
6df0: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
6e00: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
6e10: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
6e20: 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pened..  **.  **
6e30: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
6e40: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
6e50: 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c  e library compil
6e60: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74  e-time options t
6e70: 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20  o.  ** override 
6e80: 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a  this setting.  *
6e90: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6ea0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20  _TEMP_STORE: {. 
6eb0: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
6ec0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
6ed0: 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74  ngleInt(v, db->t
6ee0: 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20  emp_store);.    
6ef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
6f00: 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ngeTempStorage(p
6f10: 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a  Parse, zRight);.
6f20: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
6f30: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6f40: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
6f50: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20  ore_directory.  
6f60: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
6f70: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
6f80: 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79   = ""|"directory
6f90: 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _name".  **.  **
6fa0: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
6fb0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
6fc0: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
6fd0: 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e  _directory flag.
6fe0: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
6ff0: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
7000: 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74   specific direct
7010: 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66  ory to be used f
7020: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
7030: 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67  es..  ** Setting
7040: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
7050: 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65  g reverts to the
7060: 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61   default tempora
7070: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61  ry directory sea
7080: 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d  rch..  ** If tem
7090: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
70a0: 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
70b0: 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70  n invalidateTemp
70c0: 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  Storage..  **.  
70d0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
70e0: 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52  p_TEMP_STORE_DIR
70f0: 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66  ECTORY: {.    if
7100: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7110: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
7120: 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74  ext(v, sqlite3_t
7130: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
7140: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
7150: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
7160: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
7170: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7180: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7190: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
71a0: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
71b0: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
71c0: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
71d0: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
71e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
71f0: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
7200: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7210: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7220: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
7230: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
7240: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
7250: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
7260: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7270: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45     if( SQLITE_TE
7280: 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20  MP_STORE==0.    
7290: 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45     || (SQLITE_TE
72a0: 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64  MP_STORE==1 && d
72b0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31  b->temp_store<=1
72c0: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c  ).       || (SQL
72d0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
72e0: 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74  2 && db->temp_st
72f0: 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b  ore==1).      ){
7300: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
7310: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ateTempStorage(p
7320: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
7330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7340: 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ee(sqlite3_temp_
7350: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7360: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7370: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7380: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7390: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
73a0: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
73b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
73c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
73d0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
73e0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
73f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7400: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
7420: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7430: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
7440: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
7450: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20  irectory.  **   
7460: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
7470: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22  e_directory = ""
7480: 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65  |"directory_name
7490: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
74a0: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
74b0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
74c0: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
74d0: 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61  ctory flag.  Cha
74e0: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
74f0: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7500: 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74  ific directory t
7510: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
7520: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61  tabase files tha
7530: 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63  t.  ** were spec
7540: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
7550: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
7560: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
7570: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
7580: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65  s.  ** to the de
7590: 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64  fault database d
75a0: 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20  irectory, which 
75b0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
75c0: 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  es specified wit
75d0: 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76  h.  ** a relativ
75e0: 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62  e path will prob
75f0: 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e  ably be based on
7600: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72   the current dir
7610: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20  ectory for the. 
7620: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61   ** process.  Da
7630: 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63  tabase file spec
7640: 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62  ified with an ab
7650: 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20  solute path are 
7660: 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a  not impacted.  *
7670: 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e  * by this settin
7680: 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  g, regardless of
7690: 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a   its value..  **
76a0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
76b0: 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f  gTyp_DATA_STORE_
76c0: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
76d0: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
76e0: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
76f0: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7700: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7710: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7720: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7730: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
7740: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7750: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
7760: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7770: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
7780: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
7790: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
77a0: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
77b0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
77c0: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
77d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
77e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
77f0: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7800: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7820: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7850: 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  ee(sqlite3_data_
7860: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7870: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7880: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7890: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
78a0: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
78b0: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
78c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
78d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
78e0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
78f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7900: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7910: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
7930: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
7940: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
7950: 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  STYLE.  /*.  ** 
7960: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7970: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7980: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
7990: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72  [schema.]lock_pr
79a0: 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74  oxy_file = ":aut
79b0: 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70  o:"|"lock_file_p
79c0: 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ath".  **.  ** R
79d0: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
79e0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
79f0: 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c  ck_proxy_file fl
7a00: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7a10: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7a20: 73 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c  s a specific fil
7a30: 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  e to be used for
7a40: 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
7a50: 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a   locks..  **.  *
7a60: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7a70: 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45  _LOCK_PROXY_FILE
7a80: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
7a90: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ght ){.      Pag
7aa0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7ab0: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7ac0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7ad0: 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65  char *proxy_file
7ae0: 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _path = NULL;.  
7af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7b00: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7b10: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7b20: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7b30: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
7b40: 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
7b50: 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
7b60: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68  &proxy_file_path
7b90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
7ba0: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f  ingleText(v, pro
7bb0: 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20  xy_file_path);. 
7bc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7bd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7be0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7bf0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7c00: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7c10: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7c20: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7c30: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
7c40: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
7c50: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7c60: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
7c70: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
7c80: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
7c90: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
7cd0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
7ce0: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
7cf0: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
7d00: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
7d10: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a   NULL);.      }.
7d50: 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53        if( res!=S
7d60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7d70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7d80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69  Msg(pParse, "fai
7d90: 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20  led to set lock 
7da0: 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20  proxy file");.  
7db0: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
7dc0: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  a_out;.      }. 
7dd0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
7de0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7df0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
7e00: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20  ING_STYLE */    
7e10: 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    .    .  /*.  *
7e20: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
7e30: 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ma.]synchronous.
7e40: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
7e50: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
7e60: 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c  us=OFF|ON|NORMAL
7e70: 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a  |FULL|EXTRA.  **
7e80: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
7e90: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
7ea0: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68  lue of the synch
7eb0: 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68  ronous flag.  Ch
7ec0: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
7ed0: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
7ee0: 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
7ef0: 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
7f00: 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  le and the.  ** 
7f10: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
7f20: 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
7f30: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
7f40: 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a   database is.  *
7f50: 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  * opened..  */. 
7f60: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59   case PragTyp_SY
7f70: 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20  NCHRONOUS: {.   
7f80: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7f90: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7fa0: 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61  leInt(v, pDb->sa
7fb0: 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20  fety_level-1);. 
7fc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7fd0: 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
7fe0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mit ){.        s
7ff0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8000: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
8010: 20 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65      "Safety leve
8020: 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  l may not be cha
8030: 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72  nged inside a tr
8040: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
8050: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8060: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
8070: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
8080: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
8090: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
80a0: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
80b0: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
80c0: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
80d0: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
80e0: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
80f0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8100: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
8110: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8120: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
8130: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8140: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
8160: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
8170: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8180: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
8190: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
81a0: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
81b0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
81c0: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
81d0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
81e0: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
81f0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8200: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
8210: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
8220: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
8230: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
8240: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
8250: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
8260: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
8270: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
8280: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
8290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
82a0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
82b0: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
82c0: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
82d0: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
82e0: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
82f0: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8300: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
8310: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
8320: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
8330: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
8340: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
8350: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
8360: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
8370: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
8380: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
8390: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
83a0: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
83b0: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
83c0: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
83d0: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
83e0: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
83f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8400: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
8410: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
8420: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
8430: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
8440: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
8450: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
8460: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
8470: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
8480: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
8490: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
84a0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
84b0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
84c0: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
84d0: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
84e0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
84f0: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8500: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
8510: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
8520: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
8530: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
8540: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
8550: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
8560: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
8570: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
8580: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85a0: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
85b0: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
85c0: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
85d0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
85e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
85f0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8600: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8610: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
8620: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
8630: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
8640: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
8650: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
8660: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
8670: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
8680: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
8690: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
86a0: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
86b0: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
86c0: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
86d0: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
86e0: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
86f0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8700: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
8710: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
8720: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
8730: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
8740: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
8750: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
8760: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
8770: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
8780: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
8790: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
87a0: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
87b0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
87c0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
87d0: 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   any..  */.  cas
87e0: 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f  e PragTyp_TABLE_
87f0: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8800: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
8810: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
8820: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
8830: 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54  le(pParse, LOCAT
8840: 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c  E_NOERR, zRight,
8850: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8860: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
8870: 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74   i, k;.      int
8880: 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20   nHidden = 0;.  
8890: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
88a0: 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
88b0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
88c0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
88d0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
88e0: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
88f0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8900: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8910: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
8920: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
8930: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8940: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
8950: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
8960: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
8970: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
8980: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8990: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
89a0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
89b0: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
89c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
89d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
89e0: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
89f0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8a00: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8a10: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8a20: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8a30: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
8a40: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
8a50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a60: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8a70: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
8a80: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8a90: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8aa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
8ab0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66  ssert( pCol->pDf
8ac0: 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70  lt==0 || pCol->p
8ad0: 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
8ae0: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
8af0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8b00: 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22  d(v, 1, "issisi"
8b10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8b20: 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20   i-nHidden,.    
8b30: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8b40: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8b50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8b60: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
8b70: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8b80: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
8b90: 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ? 1 : 0,.       
8ba0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44          pCol->pD
8bb0: 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c  flt ? pCol->pDfl
8bc0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c  t->u.zToken : 0,
8bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8be0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
8bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8c00: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
8c10: 2c 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 6);.      }.  
8c20: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
8c30: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
8c40: 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20 49 6e  _STATS: {.    In
8c50: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 48  dex *pIdx;.    H
8c60: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20 20  ashElem *i;.    
8c70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 34  pParse->nMem = 4
8c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
8c90: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
8ca0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8cb0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
8cc0: 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
8cd0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
8ce0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
8cf0: 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20 54 61  xt(i)){.      Ta
8d00: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
8d10: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
8d20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8d30: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
8d40: 22 73 73 69 69 22 2c 0a 20 20 20 20 20 20 20 20  "ssii",.        
8d50: 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
8d60: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
8d70: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 73           pTab->s
8d80: 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20 20 20 20  zTabRow,.       
8d90: 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
8da0: 67 45 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  gEst);.      sql
8db0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8dc0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8dd0: 31 2c 20 34 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 4);.      for
8de0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
8df0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
8e00: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
8e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e20: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20  MultiLoad(v, 2, 
8e30: 22 73 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20  "sii",.         
8e40: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
8e50: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
8e60: 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20  szIdxRow,.      
8e70: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77       pIdx->aiRow
8e80: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  LogEst[0]);.    
8e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8ea0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
8eb0: 6c 74 52 6f 77 2c 20 31 2c 20 34 29 3b 0a 20 20  ltRow, 1, 4);.  
8ec0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8ed0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
8ee0: 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 49   PragTyp_INDEX_I
8ef0: 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20  NFO: if( zRight 
8f00: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
8f10: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
8f20: 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  Tab;.    pIdx = 
8f30: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
8f40: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
8f50: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
8f60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
8f70: 20 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20        int mx;.  
8f80: 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d      if( pPragma-
8f90: 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >iArg ){.       
8fa0: 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78   /* PRAGMA index
8fb0: 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72 20 76 65  _xinfo (newer ve
8fc0: 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20  rsion with more 
8fd0: 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  rows and columns
8fe0: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20  ) */.        mx 
8ff0: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
9000: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
9010: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
9020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9030: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
9040: 69 6e 66 6f 20 28 6c 65 67 61 63 79 20 76 65 72  info (legacy ver
9050: 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20  sion) */.       
9060: 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79   mx = pIdx->nKey
9070: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 50 61  Col;.        pPa
9080: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20  rse->nMem = 3;. 
9090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
90a0: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
90b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
90c0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
90d0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
90e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
90f0: 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d  se->nMem<=pPragm
9100: 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b  a->nPragCName );
9110: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9120: 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<mx; i++){.    
9130: 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70      i16 cnum = p
9140: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
9150: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9160: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9170: 2c 20 31 2c 20 22 69 69 73 22 2c 20 69 2c 20 63  , 1, "iis", i, c
9180: 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  num,.           
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70    cnum<0 ? 0 : p
91b0: 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e  Tab->aCol[cnum].
91c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
91d0: 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  if( pPragma->iAr
91e0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  g ){.          s
91f0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9200: 6f 61 64 28 76 2c 20 34 2c 20 22 69 73 69 22 2c  oad(v, 4, "isi",
9210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
9220: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
9230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ,.            pI
9240: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20  dx->azColl[i],. 
9250: 20 20 20 20 20 20 20 20 20 20 20 69 3c 70 49 64             i<pId
9260: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  x->nKeyCol);.   
9270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9280: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9290: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
92a0: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 1, pParse->nMe
92b0: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
92c0: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
92d0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
92e0: 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a  NDEX_LIST: if( z
92f0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64  Right ){.    Ind
9300: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61  ex *pIdx;.    Ta
9310: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
9320: 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20 3d  nt i;.    pTab =
9330: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
9340: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
9350: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
9360: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
9370: 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20  ->nMem = 5;.    
9380: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
9390: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
93a0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  , iDb);.      fo
93b0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
93c0: 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20  dex, i=0; pIdx; 
93d0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
93e0: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
93f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72  const char *azOr
9400: 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20  igin[] = { "c", 
9410: 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20  "u", "pk" };.   
9420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9430: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9440: 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20  "isisi",.       
9450: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9460: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
9470: 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69 71            IsUniq
9480: 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20  ueIndex(pIdx),. 
9490: 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67            azOrig
94a0: 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65  in[pIdx->idxType
94b0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49  ],.           pI
94c0: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
94d0: 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e!=0);.        s
94e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
94f0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9500: 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d  , 1, 5);.      }
9510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9520: 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67  ak;..  case Prag
9530: 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53  Typ_DATABASE_LIS
9540: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  T: {.    int i;.
9550: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9560: 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 3;.    for(i=
9570: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
9580: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  +){.      if( db
9590: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20  ->aDb[i].pBt==0 
95a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
95b0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
95c0: 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30  b[i].zDbSName!=0
95d0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
95e0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
95f0: 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20  , 1, "iss",.    
9600: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20       i,.        
9610: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
9620: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73  Name,.         s
9630: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
9640: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69  lename(db->aDb[i
9650: 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73  ].pBt));.      s
9660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9670: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9680: 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 3);.    }. 
9690: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63   }.  break;..  c
96a0: 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c  ase PragTyp_COLL
96b0: 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20  ATION_LIST: {.  
96c0: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
96d0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20   HashElem *p;.  
96e0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
96f0: 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71   2;.    for(p=sq
9700: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
9710: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b  b->aCollSeq); p;
9720: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
9730: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c  t(p)){.      Col
9740: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
9750: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
9760: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
9770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9780: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73  tiLoad(v, 1, "is
9790: 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a  ", i++, pColl->z
97a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
97b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
97c0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
97d0: 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 2);.    }.  }
97e0: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
97f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9800: 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a  SCHEMA_PRAGMAS *
9810: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9820: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
9830: 45 59 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  EY.  case PragTy
9840: 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49  p_FOREIGN_KEY_LI
9850: 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  ST: if( zRight )
9860: 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b  {.    FKey *pFK;
9870: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
9880: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
9890: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
98a0: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
98b0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
98c0: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62        pFK = pTab
98d0: 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69  ->pFKey;.      i
98e0: 66 28 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20  f( pFK ){.      
98f0: 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20    int i = 0; .  
9900: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9910: 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20  em = 8;.        
9920: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
9930: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
9940: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68  iDb);.        wh
9950: 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20  ile(pFK){.      
9960: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
9970: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
9980: 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  pFK->nCol; j++){
9990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
99a0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
99b0: 64 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73  d(v, 1, "iisssss
99c0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
99d0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a               j,.
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20     pFK->zTo,.   
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e  pTab->aCol[pFK->
9a30: 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a  aCol[j].iFrom].z
9a40: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
9a50: 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43           pFK->aC
9a60: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20  ol[j].zCol,.    
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
9a80: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
9a90: 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20  Action[1]),  /* 
9aa0: 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20  ON UPDATE */.   
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e  actionName(pFK->
9ad0: 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a  aAction[0]),  /*
9ae0: 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   ON DELETE */.  
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20   "NONE");.      
9b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9b20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
9b30: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38 29 3b 0a  sultRow, 1, 8);.
9b40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9b50: 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20        ++i;.     
9b60: 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e       pFK = pFK->
9b70: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20  pNextFrom;.     
9b80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9b90: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9ba0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
9bb0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
9bc0: 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a  OREIGN_KEY) */..
9bd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9be0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
9bf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9c00: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63 61  MIT_TRIGGER.  ca
9c10: 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49  se PragTyp_FOREI
9c20: 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b 0a  GN_KEY_CHECK: {.
9c30: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20      FKey *pFK;  
9c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
9c50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
9c60: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61  traint */.    Ta
9c70: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
9c80: 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74 61       /* Child ta
9c90: 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45 46  ble contain "REF
9ca0: 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72 64  ERENCES" keyword
9cb0: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
9cc0: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
9cd0: 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 74  * Parent table t
9ce0: 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73  hat child points
9cf0: 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78   to */.    Index
9d00: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
9d10: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74 68    /* Index in th
9d20: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a  e parent table *
9d30: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d50: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46  Loop counter:  F
9d60: 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65  oreign key numbe
9d70: 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  r for pTab */.  
9d80: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
9d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9da0: 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c 64   counter:  Field
9db0: 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20   of the foreign 
9dc0: 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68 45  key */.    HashE
9dd0: 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
9de0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9df0: 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20 69  r:  Next table i
9e00: 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  n schema */.    
9e10: 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20 20  int x;          
9e20: 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c 74         /* result
9e30: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
9e40: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
9e50: 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65 67          /* 3 reg
9e60: 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61  isters to hold a
9e70: 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
9e80: 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20 20     int regKey;  
9e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
9ea0: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65  ister to hold ke
9eb0: 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20 74  y for checking t
9ec0: 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74  he FK */.    int
9ed0: 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20 20   regRow;        
9ee0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
9ef0: 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20 66   to hold a row f
9f00: 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  rom pTab */.    
9f10: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
9f20: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
9f30: 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67   a loop checking
9f40: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f   foreign keys */
9f50: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b  .    int addrOk;
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
9f70: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
9f80: 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20  key is OK */.   
9f90: 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20   int *aiCols;   
9fa0: 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c 64          /* child
9fb0: 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d   to parent colum
9fc0: 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20  n mapping */..  
9fd0: 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 50    regResult = pP
9fe0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
9ff0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
a000: 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79 20  = 4;.    regKey 
a010: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a020: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 2b  ;.    regRow = +
a030: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a040: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
a050: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
a060: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b 20 3d  e, iDb);.    k =
a070: 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74   sqliteHashFirst
a080: 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  (&db->aDb[iDb].p
a090: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
a0a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29  ;.    while( k )
a0b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  {.      if( zRig
a0c0: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ht ){.        pT
a0d0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
a0e0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
a0f0: 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  0, zRight, zDb);
a100: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  .        k = 0;.
a110: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a120: 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
a130: 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
a140: 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b  ta(k);.        k
a150: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78   = sqliteHashNex
a160: 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(k);.      }.  
a170: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
a180: 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d  || pTab->pFKey==
a190: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
a1a0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
a1b0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
a1c0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
a1d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
a1e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
a1f0: 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72 73  Col+regRow>pPars
a200: 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65  e->nMem ) pParse
a210: 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e  ->nMem = pTab->n
a220: 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20  Col + regRow;.  
a230: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
a240: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
a250: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
a260: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73  enRead);.      s
a270: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
a280: 72 69 6e 67 28 76 2c 20 72 65 67 52 65 73 75 6c  ring(v, regResul
a290: 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
a2a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  .      for(i=1, 
a2b0: 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b  pFK=pTab->pFKey;
a2c0: 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70   pFK; i++, pFK=p
a2d0: 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  FK->pNextFrom){.
a2e0: 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20          pParent 
a2f0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
a300: 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c  le(db, pFK->zTo,
a310: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69   zDb);.        i
a320: 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20  f( pParent==0 ) 
a330: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a340: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
a350: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
a360: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
a370: 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c  , pParent->tnum,
a380: 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61   0, pParent->zNa
a390: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  me);.        x =
a3a0: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
a3b0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
a3c0: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
a3d0: 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  x, 0);.        i
a3e0: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
a3f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30       if( pIdx==0
a400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a410: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
a420: 28 70 50 61 72 73 65 2c 20 69 2c 20 69 44 62 2c  (pParse, i, iDb,
a430: 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65   pParent, OP_Ope
a440: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20  nRead);.        
a450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a470: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
a480: 6e 52 65 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e  nRead, i, pIdx->
a490: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
a4a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a4b0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
a4c0: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
a4d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a4e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a4f0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
a500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a520: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
a530: 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46  se->nErr>0 || pF
a540: 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  K==0 );.      if
a550: 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ( pFK ) break;. 
a560: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a570: 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73 65  >nTab<i ) pParse
a580: 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  ->nTab = i;.    
a590: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
a5a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
a5b0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20   OP_Rewind, 0); 
a5c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a5d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  .      for(i=1, 
a5e0: 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b  pFK=pTab->pFKey;
a5f0: 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70   pFK; i++, pFK=p
a600: 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  FK->pNextFrom){.
a610: 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20          pParent 
a620: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
a630: 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c  le(db, pFK->zTo,
a640: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70   zDb);.        p
a650: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
a660: 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20   aiCols = 0;.   
a670: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
a680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20   ){.          x 
a690: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
a6a0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
a6b0: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
a6c0: 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20  dx, &aiCols);.  
a6d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a6e0: 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x==0 );.        
a6f0: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6b  }.        addrOk
a700: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a710: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
a720: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
a730: 26 26 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  && pIdx==0 ){.  
a740: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4b 65 79          int iKey
a750: 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c 5b 30 5d 2e   = pFK->aCol[0].
a760: 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20  iFrom;.         
a770: 20 61 73 73 65 72 74 28 20 69 4b 65 79 3e 3d 30   assert( iKey>=0
a780: 20 26 26 20 69 4b 65 79 3c 70 54 61 62 2d 3e 6e   && iKey<pTab->n
a790: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Col );.         
a7a0: 20 69 66 28 20 69 4b 65 79 21 3d 70 54 61 62 2d   if( iKey!=pTab-
a7b0: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
a7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a7d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
a7e0: 6c 75 6d 6e 2c 20 30 2c 20 69 4b 65 79 2c 20 72  lumn, 0, iKey, r
a7f0: 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  egRow);.        
a800: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
a810: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
a820: 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f 77 29 3b  , iKey, regRow);
a830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a850: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
a860: 52 6f 77 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64  Row, addrOk); Vd
a870: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a880: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
a890: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a8a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a8b0: 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65   OP_Rowid, 0, re
a8c0: 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20  gRow);.         
a8d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
a8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a8f0: 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
a900: 69 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b 20 56  i, 0, regRow); V
a910: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a920: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a930: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
a940: 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rOk);.          
a950: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a960: 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64  ere(v, sqlite3Vd
a970: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a980: 2d 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  -2);.        }el
a990: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
a9a0: 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43  r(j=0; j<pFK->nC
a9b0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
a9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a9d0: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
a9e0: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 30  Table(v, pTab, 0
a9f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 69                ai
aa10: 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d  Cols ? aiCols[j]
aa20: 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e   : pFK->aCol[j].
aa30: 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77 2b 6a 29  iFrom, regRow+j)
aa40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
aa50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aa60: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
aa70: 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b  gRow+j, addrOk);
aa80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
aa90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
aaa0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
aab0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
aac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aad0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
aae0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70  ecord, regRow, p
aaf0: 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79  FK->nCol, regKey
ab00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
ab30: 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64 78 29  nityStr(db,pIdx)
ab40: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  , pFK->nCol);.  
ab50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ab60: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
ab70: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61  , OP_Found, i, a
ab80: 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30  ddrOk, regKey, 0
ab90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
aba0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
abb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
abc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
abd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
abe0: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20  v, OP_Rowid, 0, 
abf0: 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20  regResult+1);.  
ac00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ac10: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65  eMultiLoad(v, re
ac20: 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 22 2c  gResult+2, "si",
ac30: 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b   pFK->zTo, i-1);
ac40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ac60: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
ac70: 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20  esult, 4);.     
ac80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ac90: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
aca0: 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  drOk);.        s
acb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
acc0: 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20   aiCols);.      
acd0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
ace0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
acf0: 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70  Next, 0, addrTop
ad00: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
ad10: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
ad20: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ad30: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  v, addrTop);.   
ad40: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
ad50: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
ad60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
ad70: 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69  RIGGER) */.#endi
ad80: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
ad90: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
ada0: 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64  N_KEY) */..#ifnd
adb0: 65 66 20 4e 44 45 42 55 47 0a 20 20 63 61 73 65  ef NDEBUG.  case
adc0: 20 50 72 61 67 54 79 70 5f 50 41 52 53 45 52 5f   PragTyp_PARSER_
add0: 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28  TRACE: {.    if(
ade0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
adf0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42   if( sqlite3GetB
ae00: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
ae10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
ae20: 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28  ite3ParserTrace(
ae30: 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a  stdout, "parser:
ae40: 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   ");.      }else
ae50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae60: 33 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20  3ParserTrace(0, 
ae70: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ae80: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
ae90: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69 6e  endif..  /* Rein
aea0: 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20 61  stall the LIKE a
aeb0: 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e  nd GLOB function
aec0: 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e 74 20  s.  The variant 
aed0: 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73 65  of LIKE.  ** use
aee0: 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65 20 73  d will be case s
aef0: 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f 74 20  ensitive or not 
af00: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
af10: 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   RHS..  */.  cas
af20: 65 20 50 72 61 67 54 79 70 5f 43 41 53 45 5f 53  e PragTyp_CASE_S
af30: 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a 20 7b  ENSITIVE_LIKE: {
af40: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
af50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
af60: 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63  RegisterLikeFunc
af70: 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69 74 65  tions(db, sqlite
af80: 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67  3GetBoolean(zRig
af90: 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  ht, 0));.    }. 
afa0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66   }.  break;..#if
afb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 45  ndef SQLITE_INTE
afc0: 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f  GRITY_CHECK_ERRO
afd0: 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 53  R_MAX.# define S
afe0: 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f  QLITE_INTEGRITY_
aff0: 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20  CHECK_ERROR_MAX 
b000: 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  100.#endif..#ifn
b010: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b020: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
b030: 20 20 2f 2a 20 50 72 61 67 6d 61 20 22 71 75 69    /* Pragma "qui
b040: 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64  ck_check" is red
b050: 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  uced version of 
b060: 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f  .  ** integrity_
b070: 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74  check designed t
b080: 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61  o detect most da
b090: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
b0a0: 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6d  n.  ** without m
b0b0: 6f 73 74 20 6f 66 20 74 68 65 20 6f 76 65 72 68  ost of the overh
b0c0: 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 69 6e  ead of a full in
b0d0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a 20  tegrity-check.. 
b0e0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
b0f0: 79 70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  yp_INTEGRITY_CHE
b100: 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c  CK: {.    int i,
b110: 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b   j, addr, mxErr;
b120: 0a 0a 20 20 20 20 69 6e 74 20 69 73 51 75 69 63  ..    int isQuic
b130: 6b 20 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f  k = (sqlite3Tolo
b140: 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27  wer(zLeft[0])=='
b150: 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  q');..    /* If 
b160: 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  the PRAGMA comma
b170: 6e 64 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f  nd was of the fo
b180: 72 6d 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e  rm "PRAGMA <db>.
b190: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
b1a0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44  ,.    ** then iD
b1b0: 62 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  b is set to the 
b1c0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
b1d0: 61 62 61 73 65 20 69 64 65 6e 74 69 66 69 65 64  abase identified
b1e0: 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a   by <db>..    **
b1f0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
b200: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
b210: 64 61 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c  database iDb onl
b220: 79 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  y is verified by
b230: 0a 20 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45  .    ** the VDBE
b240: 20 63 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a   created below..
b250: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74      **.    ** Ot
b260: 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
b270: 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70  command was simp
b280: 6c 79 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67  ly "PRAGMA integ
b290: 72 69 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a  rity_check" (or.
b2a0: 20 20 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71      ** "PRAGMA q
b2b0: 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68  uick_check"), th
b2c0: 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74 6f  en iDb is set to
b2d0: 20 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65   0. In this case
b2e0: 2c 20 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a  , set iDb.    **
b2f0: 20 74 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20   to -1 here, to 
b300: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
b310: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65  e VDBE should ve
b320: 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72 69  rify the integri
b330: 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c  ty.    ** of all
b340: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
b350: 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ses.  */.    ass
b360: 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20  ert( iDb>=0 );. 
b370: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
b380: 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a  0 || pId2->z );.
b390: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d      if( pId2->z=
b3a0: 3d 30 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a  =0 ) iDb = -1;..
b3b0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
b3c0: 65 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  e the VDBE progr
b3d0: 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65  am */.    pParse
b3e0: 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20  ->nMem = 6;..   
b3f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69   /* Set the maxi
b400: 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20  mum error count 
b410: 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53  */.    mxErr = S
b420: 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f  QLITE_INTEGRITY_
b430: 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b  CHECK_ERROR_MAX;
b440: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
b450: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b460: 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c  GetInt32(zRight,
b470: 20 26 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20   &mxErr);.      
b480: 69 66 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a  if( mxErr<=0 ){.
b490: 20 20 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20          mxErr = 
b4a0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b4b0: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b4d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b4e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b4f0: 67 65 72 2c 20 6d 78 45 72 72 2c 20 31 29 3b 20  ger, mxErr, 1); 
b500: 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73   /* reg[1] holds
b510: 20 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a   errors left */.
b520: 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e  .    /* Do an in
b530: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e  tegrity check on
b540: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
b550: 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ile */.    for(i
b560: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
b570: 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  ++){.      HashE
b580: 6c 65 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48 61  lem *x;.      Ha
b590: 73 68 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20  sh *pTbls;.     
b5a0: 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20   int *aRoot;.   
b5b0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
b5c0: 20 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20        int mxIdx 
b5d0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
b5e0: 49 64 78 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  Idx;..      if( 
b5f0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
b600: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
b610: 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30        if( iDb>=0
b620: 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e   && i!=iDb ) con
b630: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71  tinue;..      sq
b640: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
b650: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
b660: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
b670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b680: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29  (v, OP_IfPos, 1)
b690: 3b 20 2f 2a 20 48 61 6c 74 20 69 66 20 6f 75 74  ; /* Halt if out
b6a0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
b6b0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b6c0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
b6d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b6e0: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
b6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b700: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b710: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f  r);..      /* Do
b720: 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68   an integrity ch
b730: 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65  eck of the B-Tre
b740: 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  e.      **.     
b750: 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6e   ** Begin by fin
b760: 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61  ding the root pa
b770: 67 65 73 20 6e 75 6d 62 65 72 73 0a 20 20 20 20  ges numbers.    
b780: 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
b790: 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
b7a0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
b7b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b7c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
b7d0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
b7e0: 62 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, i, 0) );.    
b7f0: 20 20 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61    pTbls = &db->a
b800: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[i].pSchema->t
b810: 62 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 66 6f  blHash;.      fo
b820: 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74  r(cnt=0, x=sqlit
b830: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
b840: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
b850: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
b860: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b870: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
b880: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
b890: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20  ex *pIdx;.      
b8a0: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
b8b0: 54 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20  Tab) ) cnt++;.  
b8c0: 20 20 20 20 20 20 66 6f 72 28 6e 49 64 78 3d 30        for(nIdx=0
b8d0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
b8e0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
b8f0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64  pIdx->pNext, nId
b900: 78 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20  x++){ cnt++; }. 
b910: 20 20 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e         if( nIdx>
b920: 6d 78 49 64 78 20 29 20 6d 78 49 64 78 20 3d 20  mxIdx ) mxIdx = 
b930: 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nIdx;.      }.  
b940: 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69      aRoot = sqli
b950: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b960: 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
b970: 2a 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20  *(cnt+1));.     
b980: 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20   if( aRoot==0 ) 
b990: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
b9a0: 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65  (cnt=0, x=sqlite
b9b0: 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29  HashFirst(pTbls)
b9c0: 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73  ; x; x=sqliteHas
b9d0: 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20  hNext(x)){.     
b9e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
b9f0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
ba00: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  x);.        Inde
ba10: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20  x *pIdx;.       
ba20: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
ba30: 61 62 29 20 29 20 61 52 6f 6f 74 5b 63 6e 74 2b  ab) ) aRoot[cnt+
ba40: 2b 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  +] = pTab->tnum;
ba50: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
ba60: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
ba70: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
ba80: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
ba90: 20 20 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20     aRoot[cnt++] 
baa0: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
bab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
bac0: 20 20 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74 5d        aRoot[cnt]
bad0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
bae0: 4d 61 6b 65 20 73 75 72 65 20 73 75 66 66 69 63  Make sure suffic
baf0: 69 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 72  ient number of r
bb00: 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62 65  egisters have be
bb10: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
bb20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
bb30: 65 6d 20 3d 20 4d 41 58 28 20 70 50 61 72 73 65  em = MAX( pParse
bb40: 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20  ->nMem, 8+mxIdx 
bb50: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  );..      /* Do 
bb60: 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67  the b-tree integ
bb70: 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20  rity checks */. 
bb80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bb90: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74  AddOp4(v, OP_Int
bba0: 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74  egrityCk, 2, cnt
bbb0: 2c 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f  , 1, (char*)aRoo
bbc0: 74 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  t,P4_INTARRAY);.
bbd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bbe0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
bbf0: 29 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  )i);.      addr 
bc00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
bc10: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
bc20: 2c 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 2); VdbeCovera
bc30: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
bc40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
bc50: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
bc60: 20 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   3, 0,.         
bc70: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
bc80: 62 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62  b, "*** in datab
bc90: 61 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64  ase %s ***\n", d
bca0: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
bcb0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50 34  me),.         P4
bcc0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
bcd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bce0: 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32  p3(v, OP_Move, 2
bcf0: 2c 20 34 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  , 4, 1);.      s
bd00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bd10: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
bd20: 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , 3, 2);.      s
bd30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
bd40: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
bd50: 2c 20 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  , 2, 1);.      s
bd60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
bd70: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20  re(v, addr);..  
bd80: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
bd90: 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65 73   all the indices
bda0: 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65 64   are constructed
bdb0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20   correctly..    
bdc0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 78    */.      for(x
bdd0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
bde0: 28 70 54 62 6c 73 29 3b 20 78 20 26 26 20 21 69  (pTbls); x && !i
bdf0: 73 51 75 69 63 6b 3b 20 78 3d 73 71 6c 69 74 65  sQuick; x=sqlite
be00: 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20  HashNext(x)){.  
be10: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
be20: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
be30: 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49  ta(x);.        I
be40: 6e 64 65 78 20 2a 70 49 64 78 2c 20 2a 70 50 6b  ndex *pIdx, *pPk
be50: 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  ;.        Index 
be60: 2a 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  *pPrior = 0;.   
be70: 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70       int loopTop
be80: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  ;.        int iD
be90: 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 3b  ataCur, iIdxCur;
bea0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
beb0: 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20 69  = -1;..        i
bec0: 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  f( pTab->pIndex=
bed0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
bee0: 20 20 20 20 20 20 20 70 50 6b 20 3d 20 48 61 73         pPk = Has
bef0: 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30 20  Rowid(pTab) ? 0 
bf00: 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  : sqlite3Primary
bf10: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
bf20: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
bf30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bf40: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29  (v, OP_IfPos, 1)
bf50: 3b 20 20 2f 2a 20 53 74 6f 70 20 69 66 20 6f 75  ;  /* Stop if ou
bf60: 74 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  t of errors */. 
bf70: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
bf80: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
bf90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bfa0: 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c  2(v, OP_Halt, 0,
bfb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
bfc0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
bfd0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
bfe0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
bff0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
c000: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c010: 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64  3OpenTableAndInd
c020: 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ices(pParse, pTa
c030: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  b, OP_OpenRead, 
c040: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61        1, 0, &iDa
c070: 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29  taCur, &iIdxCur)
c080: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c090: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c0a0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29  P_Integer, 0, 7)
c0b0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
c0c0: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c0d0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c0e0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
c0f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
c100: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c110: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c120: 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78  , 8+j); /* index
c130: 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72   entries counter
c140: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
c150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c160: 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20  arse->nMem>=8+j 
c170: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c180: 74 28 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70  t( sqlite3NoTemp
c190: 73 49 6e 52 61 6e 67 65 28 70 50 61 72 73 65 2c  sInRange(pParse,
c1a0: 31 2c 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20  1,7+j) );.      
c1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c1c0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
c1d0: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b 20  , iDataCur, 0); 
c1e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c1f0: 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70  .        loopTop
c200: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c210: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
c220: 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20  m, 7, 1);.      
c230: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
c240: 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f   all NOT NULL co
c250: 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65  lumns really are
c260: 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   NOT NULL */.   
c270: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
c280: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
c290: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
c2a0: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
c2b0: 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33    int jmp2, jmp3
c2c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c2d0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
c2e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c2f0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61       if( pTab->a
c300: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
c310: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
c320: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
c330: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
c340: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
c350: 20 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 33 29   iDataCur, j, 3)
c360: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
c380: 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
c390: 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
c3a0: 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp2 = sqlite3Vd
c3b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
c3c0: 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65  otNull, 3); Vdbe
c3d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
c3e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c3f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
c400: 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 20 2f  ddImm, 1, -1); /
c410: 2a 20 44 65 63 72 65 6d 65 6e 74 20 65 72 72 6f  * Decrement erro
c420: 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20  r limit */.     
c430: 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69       zErr = sqli
c440: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
c450: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25 73  NULL value in %s
c460: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
c470: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
c4a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
c4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4c0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
c4d0: 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c  , 0, 3, 0, zErr,
c4e0: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
c4f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c500: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c510: 52 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29  ResultRow, 3, 1)
c520: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 33  ;.          jmp3
c530: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c540: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
c550: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
c560: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
c570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c580: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
c590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c5a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c5b0: 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20   jmp2);.        
c5c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c5d0: 70 48 65 72 65 28 76 2c 20 6a 6d 70 33 29 3b 0a  pHere(v, jmp3);.
c5e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c5f0: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 69 6e    /* Validate in
c600: 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72 20  dex entries for 
c610: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
c620: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
c630: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
c640: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
c650: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
c660: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
c670: 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a  nt jmp2, jmp3, j
c680: 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20  mp4, jmp5;.     
c690: 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20       int ckUniq 
c6a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
c6b0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
c6c0: 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49       if( pPk==pI
c6d0: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
c6e0: 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
c6f0: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
c700: 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
c710: 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c  dx, iDataCur, 0,
c720: 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20   0, &jmp3,.     
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20    pPrior, r1);. 
c760: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
c770: 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
c780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c790: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
c7a0: 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20 69  , 8+j, 1);  /* i
c7b0: 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63  ncrement entry c
c7c0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ount */.        
c7d0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
c7e0: 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
c7f0: 65 78 69 73 74 73 20 66 6f 72 20 74 68 65 20 63  exists for the c
c800: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77  urrent table row
c810: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6a 6d   */.          jm
c820: 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
c830: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
c840: 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a  Found, iIdxCur+j
c850: 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20  , ckUniq, r1,.  
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
c890: 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  n); VdbeCoverage
c8a0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
c8b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c8c0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
c8d0: 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63 72 65 6d  , -1); /* Decrem
c8e0: 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d 69 74 20  ent error limit 
c8f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
c900: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
c910: 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20 22 29  ng(v, 3, "row ")
c920: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c930: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c940: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c 20 33   OP_Concat, 7, 3
c950: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
c960: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
c970: 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20 6d 69  tring(v, 4, " mi
c980: 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78  ssing from index
c990: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   ");.          s
c9a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c9b0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
c9c0: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
c9d0: 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65     jmp5 = sqlite
c9e0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
c9f0: 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  v, 4, pIdx->zNam
ca00: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
ca10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ca20: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c  v, OP_Concat, 4,
ca30: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
ca40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca50: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
ca60: 52 6f 77 2c 20 33 2c 20 31 29 3b 0a 20 20 20 20  Row, 3, 1);.    
ca70: 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 73 71 6c        jmp4 = sql
ca80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ca90: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20  , OP_IfPos, 1); 
caa0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cab0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cac0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
cad0: 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 20 20  OP_Halt);.      
cae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
caf0: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29  umpHere(v, jmp2)
cb00: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;.          /* F
cb10: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65  or UNIQUE indexe
cb20: 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 6f  s, verify that o
cb30: 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78  nly one entry ex
cb40: 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20 20  ists with the.  
cb50: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
cb60: 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74  nt key.  The ent
cb70: 72 79 20 69 73 20 75 6e 69 71 75 65 20 69 66 20  ry is unique if 
cb80: 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69  (1) any column i
cb90: 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  s NULL.         
cba0: 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e   ** or (2) the n
cbb0: 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20  ext entry has a 
cbc0: 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f  different key */
cbd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
cbe0: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
cbf0: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x) ){.          
cc00: 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73    int uniqOk = s
cc10: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cc20: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
cc30: 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20      int jmp6;.  
cc40: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 6b            int kk
cc50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
cc60: 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d  r(kk=0; kk<pIdx-
cc70: 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b  >nKeyCol; kk++){
cc80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
cc90: 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt iCol = pIdx->
cca0: 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20  aiColumn[kk];.  
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
ccc0: 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57  rt( iCol!=XN_ROW
ccd0: 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  ID && iCol<pTab-
cce0: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  >nCol );.       
ccf0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
cd00: 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c  =0 && pTab->aCol
cd10: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
cd20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
cd30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cd40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cd50: 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20  _IsNull, r1+kk, 
cd60: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
cd70: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
cd80: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
cd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
cda0: 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65 33    jmp6 = sqlite3
cdb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
cdc0: 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b 6a  _Next, iIdxCur+j
cdd0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
cde0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
cdf0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
ce00: 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  v, uniqOk);.    
ce10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ce20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
ce30: 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mp6);.          
ce40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce50: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
ce60: 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75  GT, iIdxCur+j, u
ce70: 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20  niqOk, r1,.     
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
cea0: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
ceb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
cec0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ced0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cee0: 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b  _AddImm, 1, -1);
cef0: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65 72   /* Decrement er
cf00: 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20  ror limit */.   
cf10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cf20: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
cf30: 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65  , 3, "non-unique
cf40: 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20   entry in index 
cf50: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
cf60: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
cf70: 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20  v, jmp5);.      
cf80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf90: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
cfa0: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
cfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
cfc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cfd0: 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20  ere(v, jmp4);.  
cfe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
cff0: 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
d000: 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29  el(pParse, jmp3)
d010: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d030: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
d040: 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70  , iDataCur, loop
d050: 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Top); VdbeCovera
d060: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
d070: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d080: 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29  re(v, loopTop-1)
d090: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d0a0: 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
d0b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d0c0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
d0d0: 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23 20 6f 66  , 2, "wrong # of
d0e0: 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e 64 65   entries in inde
d0f0: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  x ");.        fo
d100: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
d110: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d120: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d130: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
d140: 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20    if( pPk==pIdx 
d150: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d160: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d170: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d180: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
d190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d1a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
d1b0: 20 31 2c 20 61 64 64 72 2b 32 29 3b 20 56 64 62   1, addr+2); Vdb
d1c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d1d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d1e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d1f0: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Halt, 0, 0);.   
d200: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d210: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
d220: 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ount, iIdxCur+j,
d230: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   3);.          s
d240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d250: 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c 20  (v, OP_Eq, 8+j, 
d260: 61 64 64 72 2b 38 2c 20 33 29 3b 20 56 64 62 65  addr+8, 3); Vdbe
d270: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d290: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
d2a0: 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
d2b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d2c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d2d0: 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b  _AddImm, 1, -1);
d2e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d2f0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
d300: 28 76 2c 20 33 2c 20 70 49 64 78 2d 3e 7a 4e 61  (v, 3, pIdx->zNa
d310: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
d320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d330: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 33  (v, OP_Concat, 3
d340: 2c 20 32 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  , 2, 7);.       
d350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d360: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
d370: 74 52 6f 77 2c 20 37 2c 20 31 29 3b 0a 20 20 20  tRow, 7, 1);.   
d380: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
d390: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
d3a0: 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
d3b0: 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a   } .    }.    {.
d3c0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
d3d0: 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42  st int iLn = VDB
d3e0: 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28  E_OFFSET_LINENO(
d3f0: 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  2);.      static
d400: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
d410: 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a  t endCode[] = {.
d420: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64          { OP_Add
d430: 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20  Imm,      1, 0, 
d440: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
d450: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   0 */.        { 
d460: 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20 20  OP_If,          
d470: 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 4,        0},
d480: 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
d490: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38      { OP_String8
d4a0: 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20  ,     0, 3,     
d4b0: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a     0},    /* 2 *
d4c0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52  /.        { OP_R
d4d0: 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31  esultRow,   3, 1
d4e0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
d4f0: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7d 3b  /* 3 */.      };
d500: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
d510: 4f 70 3b 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d  Op;..      aOp =
d520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d530: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
d540: 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64  ze(endCode), end
d550: 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20  Code, iLn);.    
d560: 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20    if( aOp ){.   
d570: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d       aOp[0].p2 =
d580: 20 2d 6d 78 45 72 72 3b 0a 20 20 20 20 20 20 20   -mxErr;.       
d590: 20 61 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d   aOp[2].p4type =
d5a0: 20 50 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20   P4_STATIC;.    
d5b0: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20      aOp[2].p4.z 
d5c0: 3d 20 22 6f 6b 22 3b 0a 20 20 20 20 20 20 7d 0a  = "ok";.      }.
d5d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
d5e0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
d5f0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
d600: 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
d610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d620: 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a  _UTF16.  /*.  **
d630: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
d640: 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ng.  **   PRAGMA
d650: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66   encoding = "utf
d660: 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74  -8"|"utf-16"|"ut
d670: 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62  f-16le"|"utf-16b
d680: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e".  **.  ** In 
d690: 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d 2c 20  its first form, 
d6a0: 74 68 69 73 20 70 72 61 67 6d 61 20 72 65 74 75  this pragma retu
d6b0: 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  rns the encoding
d6c0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a   of the main.  *
d6d0: 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  * database. If t
d6e0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
d6f0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
d700: 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
d710: 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  d now..  **.  **
d720: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
d730: 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61 20   of this pragma 
d740: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
d750: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
d760: 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  file.  ** has no
d770: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  t already been i
d780: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74  nitialized. In t
d790: 68 69 73 20 63 61 73 65 20 69 74 20 73 65 74 73  his case it sets
d7a0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
d7b0: 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20  * encoding that 
d7c0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
d7d0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
d7e0: 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65 77  se file if a new
d7f0: 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72   file.  ** is cr
d800: 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78 69  eated. If an exi
d810: 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61 62  sting main datab
d820: 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
d830: 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ed, then the.  *
d840: 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65  * default text e
d850: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20  ncoding for the 
d860: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
d870: 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20  e is used..  ** 
d880: 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  .  ** In all cas
d890: 65 73 20 6e 65 77 20 64 61 74 61 62 61 73 65 73  es new databases
d8a0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
d8b0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
d8c0: 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61 74  d are.  ** creat
d8d0: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 73 61  ed to use the sa
d8e0: 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78 74 20  me default text 
d8f0: 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65 20  encoding as the 
d900: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 49  main database. I
d910: 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20  f.  ** the main 
d920: 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74  database has not
d930: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
d940: 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 64  d and/or created
d950: 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20 2a   when ATTACH.  *
d960: 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74  * is executed, t
d970: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
d980: 72 65 20 74 68 65 20 41 54 54 41 43 48 20 6f 70  re the ATTACH op
d990: 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20  eration..  **.  
d9a0: 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** In the second
d9b0: 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67 6d   form this pragm
d9c0: 61 20 73 65 74 73 20 74 68 65 20 74 65 78 74 20  a sets the text 
d9d0: 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 75  encoding to be u
d9e0: 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20  sed in.  ** new 
d9f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
da00: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 69  reated using thi
da10: 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
da20: 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20  e. It is only.  
da30: 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e 76  ** useful if inv
da40: 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  oked immediately
da50: 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e 20   after the main 
da60: 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a  database i.  */.
da70: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 45    case PragTyp_E
da80: 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73  NCODING: {.    s
da90: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
daa0: 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20  ct EncName {.   
dab0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
dac0: 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a 20 20        u8 enc;.  
dad0: 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d    } encnames[] =
dae0: 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54 46 38   {.      { "UTF8
daf0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  ",     SQLITE_UT
db00: 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  F8        },.   
db10: 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20     { "UTF-8",   
db20: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20   SQLITE_UTF8    
db30: 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20      },  /* Must 
db40: 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a  be element [1] *
db50: 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  /.      { "UTF-1
db60: 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6le", SQLITE_UTF
db70: 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20  16LE     },  /* 
db80: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
db90: 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [2] */.      { "
dba0: 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c 49 54  UTF-16be", SQLIT
dbb0: 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c  E_UTF16BE     },
dbc0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
dbd0: 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20  ment [3] */.    
dbe0: 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20    { "UTF16le",  
dbf0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20  SQLITE_UTF16LE  
dc00: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
dc10: 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49 54 45  TF16be",  SQLITE
dc20: 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a  _UTF16BE     },.
dc30: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22        { "UTF-16"
dc40: 2c 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  ,   0           
dc50: 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c         }, /* SQL
dc60: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
dc70: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
dc80: 36 22 2c 20 20 20 20 30 20 20 20 20 20 20 20 20  6",    0        
dc90: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20            }, /* 
dca0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
dcb0: 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c  VE */.      { 0,
dcc0: 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
dcd0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63  const struct Enc
dce0: 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20  Name *pEnc;.    
dcf0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 20 20  if( !zRight ){  
dd00: 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63    /* "PRAGMA enc
dd10: 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20  oding" */.      
dd20: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
dd30: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
dd40: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
dd50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
dd60: 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55  ncnames[SQLITE_U
dd70: 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  TF8].enc==SQLITE
dd80: 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 61  _UTF8 );.      a
dd90: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
dda0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e  SQLITE_UTF16LE].
ddb0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
ddc0: 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  6LE );.      ass
ddd0: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
dde0: 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e  LITE_UTF16BE].en
ddf0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
de00: 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E );.      retur
de10: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 65  nSingleText(v, e
de20: 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61 72  ncnames[ENC(pPar
de30: 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b  se->db)].zName);
de40: 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20  .    }else{     
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e     /* "PRAGMA en
de70: 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f  coding = XXX" */
de80: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63  .      /* Only c
de90: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
dea0: 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20 69 66  of sqlite.enc if
deb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
dec0: 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20 20  ndle is not.    
ded0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
dee0: 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  . If the main da
def0: 74 61 62 61 73 65 20 65 78 69 73 74 73 2c 20 74  tabase exists, t
df00: 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e  he new sqlite.en
df10: 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  c value.      **
df20: 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
df30: 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20 73 63  tten when the sc
df40: 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f 61  hema is next loa
df50: 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20  ded. If it does 
df60: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  not.      ** alr
df70: 65 61 64 79 20 65 78 69 73 74 73 2c 20 69 74 20  eady exists, it 
df80: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
df90: 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20 65  to use the new e
dfa0: 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20  ncoding value.. 
dfb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
dfc0: 28 20 0a 20 20 20 20 20 20 20 20 21 28 44 62 48  ( .        !(DbH
dfd0: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30  asProperty(db, 0
dfe0: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
dff0: 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  d)) || .        
e000: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
e010: 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a  , 0, DB_Empty) .
e020: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e030: 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61   for(pEnc=&encna
e040: 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e  mes[0]; pEnc->zN
e050: 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20  ame; pEnc++){.  
e060: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
e070: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
e080: 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d  ight, pEnc->zNam
e090: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
e0a0: 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29    SCHEMA_ENC(db)
e0b0: 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20 20 20   = ENC(db) =.   
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 6e               pEn
e0d0: 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65  c->enc ? pEnc->e
e0e0: 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54 46 31  nc : SQLITE_UTF1
e0f0: 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20 20 20  6NATIVE;.       
e100: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e120: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  }.        if( !p
e130: 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Enc->zName ){.  
e140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e150: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e160: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65 6e 63  "unsupported enc
e170: 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67  oding: %s", zRig
e180: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ht);.        }. 
e190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e1a0: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
e1b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e1c0: 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
e1d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
e1e0: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41  HEMA_VERSION_PRA
e1f0: 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  GMAS.  /*.  **  
e200: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
e210: 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a  ]schema_version.
e220: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e230: 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65  chema.]schema_ve
e240: 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72  rsion = <integer
e250: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  >.  **.  **   PR
e260: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73  AGMA [schema.]us
e270: 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20  er_version.  ** 
e280: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e290: 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d  .]user_version =
e2a0: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
e2b0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e2c0: 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f  chema.]freelist_
e2d0: 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  count.  **.  ** 
e2e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e2f0: 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20  .]data_version. 
e300: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e310: 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69  A [schema.]appli
e320: 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20  cation_id.  **  
e330: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
e340: 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20  ]application_id 
e350: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
e360: 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67 6d 61  .  ** The pragma
e370: 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  's schema_versio
e380: 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72 73 69  n and user_versi
e390: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  on are used to s
e3a0: 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74  et or get.  ** t
e3b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
e3c0: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61  schema-version a
e3d0: 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c  nd user-version,
e3e0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 42   respectively. B
e3f0: 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  oth.  ** the sch
e400: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
e410: 74 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  the user-version
e420: 20 61 72 65 20 33 32 2d 62 69 74 20 73 69 67 6e   are 32-bit sign
e430: 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a  ed integers.  **
e440: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
e450: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 0a  atabase header..
e460: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63    **.  ** The sc
e470: 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75  hema-cookie is u
e480: 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69  sually only mani
e490: 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e 61 6c  pulated internal
e4a0: 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74  ly by SQLite. It
e4b0: 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65  .  ** is increme
e4c0: 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  nted by SQLite w
e4d0: 68 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61  henever the data
e4e0: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6d  base schema is m
e4f0: 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20 2a 2a  odified (by.  **
e500: 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 72 6f   creating or dro
e510: 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 72  pping a table or
e520: 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73 63 68   index). The sch
e530: 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73 20 75  ema version is u
e540: 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69  sed by.  ** SQLi
e550: 74 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 71  te each time a q
e560: 75 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64  uery is executed
e570: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
e580: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
e590: 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  he.  ** of the s
e5a0: 63 68 65 6d 61 20 75 73 65 64 20 77 68 65 6e 20  chema used when 
e5b0: 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51  compiling the SQ
e5c0: 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20  L query matches 
e5d0: 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a 20 20  the schema of.  
e5e0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
e5f0: 61 67 61 69 6e 73 74 20 77 68 69 63 68 20 74 68  against which th
e600: 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79  e compiled query
e610: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65   is actually exe
e620: 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76  cuted..  ** Subv
e630: 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65 63 68  erting this mech
e640: 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67 20 22  anism by using "
e650: 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
e660: 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79  rsion" to modify
e670: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
e680: 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 74 65  -version is pote
e690: 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75  ntially dangerou
e6a0: 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64 20 74  s and may lead t
e6b0: 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63  o program.  ** c
e6c0: 72 61 73 68 65 73 20 6f 72 20 64 61 74 61 62 61  rashes or databa
e6d0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55  se corruption. U
e6e0: 73 65 20 77 69 74 68 20 63 61 75 74 69 6f 6e 21  se with caution!
e6f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75  .  **.  ** The u
e700: 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e  ser-version is n
e710: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
e720: 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74  ly by SQLite. It
e730: 20 6d 61 79 20 62 65 20 75 73 65 64 20 62 79 0a   may be used by.
e740: 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e    ** application
e750: 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  s for any purpos
e760: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
e770: 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f 56 41  ragTyp_HEADER_VA
e780: 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  LUE: {.    int i
e790: 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d 61  Cookie = pPragma
e7a0: 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57 68 69 63  ->iArg;  /* Whic
e7b0: 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64  h cookie to read
e7c0: 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   or write */.   
e7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
e7e0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
e7f0: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26     if( zRight &&
e800: 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
e810: 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
e820: 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20  adOnly)==0 ){.  
e830: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e840: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69   specified cooki
e850: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  e value */.     
e860: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
e870: 62 65 4f 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b  beOpList setCook
e880: 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ie[] = {.       
e890: 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f   { OP_Transactio
e8a0: 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d  n,    0,  1,  0}
e8b0: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
e8c0: 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f       { OP_SetCoo
e8d0: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 30 2c  kie,      0,  0,
e8e0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
e8f0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
e900: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
e910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
e920: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
e930: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
e940: 65 28 73 65 74 43 6f 6f 6b 69 65 29 29 3b 0a 20  e(setCookie));. 
e950: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
e960: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
e970: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74  v, ArraySize(set
e980: 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f 6b  Cookie), setCook
e990: 69 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ie, 0);.      if
e9a0: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
e9b0: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
e9c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e9d0: 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b  aOp[0].p1 = iDb;
e9e0: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31  .      aOp[1].p1
e9f0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
ea00: 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b 69  p[1].p2 = iCooki
ea10: 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  e;.      aOp[1].
ea20: 70 33 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69  p3 = sqlite3Atoi
ea30: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  (zRight);.    }e
ea40: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  lse{.      /* Re
ea50: 61 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ad the specified
ea60: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
ea70: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
ea80: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 72  nst VdbeOpList r
ea90: 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a  eadCookie[] = {.
eaa0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
eab0: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 30 2c  nsaction,     0,
eac0: 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    0,  0},    /* 
ead0: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  0 */.        { O
eae0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 20  P_ReadCookie,   
eaf0: 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20     0,  1,  0},  
eb00: 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20    /* 1 */.      
eb10: 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77    { OP_ResultRow
eb20: 2c 20 20 20 20 20 20 20 31 2c 20 20 31 2c 20 20  ,       1,  1,  
eb30: 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  0}.      };.    
eb40: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
eb50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eb60: 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65  VerifyNoMallocRe
eb70: 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79 53  quired(v, ArrayS
eb80: 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 29  ize(readCookie))
eb90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
eba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
ebb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
ebc0: 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72 65 61 64  readCookie),read
ebd0: 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20 20 20 20  Cookie,0);.     
ebe0: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
ebf0: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
ec00: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
ec10: 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69     aOp[0].p1 = i
ec20: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
ec30: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
ec40: 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 69 43 6f   aOp[1].p3 = iCo
ec50: 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  okie;.      sqli
ec60: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
ec70: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  v);.    }.  }.  
ec80: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
ec90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
eca0: 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47  EMA_VERSION_PRAG
ecb0: 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  MAS */..#ifndef 
ecc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ecd0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
ece0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
ecf0: 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f  MA compile_optio
ed00: 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  ns.  **.  ** Ret
ed10: 75 72 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  urn the names of
ed20: 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   all compile-tim
ed30: 65 20 6f 70 74 69 6f 6e 73 20 75 73 65 64 20 69  e options used i
ed40: 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 0a 20 20  n this build,.  
ed50: 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e 20 70 65  ** one option pe
ed60: 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  r row..  */.  ca
ed70: 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4d 50 49  se PragTyp_COMPI
ed80: 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20 20  LE_OPTIONS: {.  
ed90: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
eda0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
edb0: 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  t;.    pParse->n
edc0: 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20 77 68 69  Mem = 1;.    whi
edd0: 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71 6c 69  le( (zOpt = sqli
ede0: 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
edf0: 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30 20 29  n_get(i++))!=0 )
ee00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ee10: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
ee20: 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20 20 20   1, zOpt);.     
ee30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee40: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ee50: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ow, 1, 1);.    }
ee60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ee70: 52 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 7d  Reusable(v);.  }
ee80: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
ee90: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
eea0: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
eeb0: 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  AGS */..#ifndef 
eec0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
eed0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
eee0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77 61 6c 5f  MA [schema.]wal_
eef0: 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73  checkpoint = pas
ef00: 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72  sive|full|restar
ef10: 74 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a 2a 0a  t|truncate.  **.
ef20: 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20    ** Checkpoint 
ef30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
ef40: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
ef50: 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49 4e 54  p_WAL_CHECKPOINT
ef60: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 42 74 20  : {.    int iBt 
ef70: 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44 62 3a 53  = (pId2->z?iDb:S
ef80: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
ef90: 45 44 29 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f  ED);.    int eMo
efa0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
efb0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3b 0a  KPOINT_PASSIVE;.
efc0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
efd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
efe0: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
eff0: 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b  t, "full")==0 ){
f000: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
f010: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f020: 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  NT_FULL;.      }
f030: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
f040: 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  StrICmp(zRight, 
f050: 22 72 65 73 74 61 72 74 22 29 3d 3d 30 20 29 7b  "restart")==0 ){
f060: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
f070: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f080: 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20 20 20 20  NT_RESTART;.    
f090: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f0a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f0b0: 74 2c 20 22 74 72 75 6e 63 61 74 65 22 29 3d 3d  t, "truncate")==
f0c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
f0d0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43  de = SQLITE_CHEC
f0e0: 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3b  KPOINT_TRUNCATE;
f0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f100: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
f110: 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 3;.    sqlite3
f120: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f130: 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 42 74  _Checkpoint, iBt
f140: 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20 20 20  , eMode, 1);.   
f150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f160: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
f170: 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d 0a 20  ow, 1, 3);.  }. 
f180: 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20   break;..  /*.  
f190: 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  **   PRAGMA wal_
f1a0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20  autocheckpoint. 
f1b0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c   **   PRAGMA wal
f1c0: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
f1d0: 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  = N.  **.  ** Co
f1e0: 6e 66 69 67 75 72 65 20 61 20 64 61 74 61 62 61  nfigure a databa
f1f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
f200: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
f210: 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61  heckpoint a data
f220: 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  base.  ** after 
f230: 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66  accumulating N f
f240: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
f250: 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72 20 74  . Or query for t
f260: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
f270: 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f  .  ** of N..  */
f280: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f290: 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
f2a0: 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  NT: {.    if( zR
f2b0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
f2c0: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
f2d0: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71 6c  eckpoint(db, sql
f2e0: 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
f2f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
f300: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
f310: 0a 20 20 20 20 20 20 20 64 62 2d 3e 78 57 61 6c  .       db->xWal
f320: 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65  Callback==sqlite
f330: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20  3WalDefaultHook 
f340: 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  ? .           SQ
f350: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
f360: 64 62 2d 3e 70 57 61 6c 41 72 67 29 20 3a 20 30  db->pWalArg) : 0
f370: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
f380: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
f390: 2a 20 20 50 52 41 47 4d 41 20 73 68 72 69 6e 6b  *  PRAGMA shrink
f3a0: 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a  _memory.  **.  *
f3b0: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
f3c0: 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d 34 36 31  -OF: R-23445-461
f3d0: 30 39 20 54 68 69 73 20 70 72 61 67 6d 61 20 63  09 This pragma c
f3e0: 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
f3f0: 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  se.  ** connecti
f400: 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69 74 20 69  on on which it i
f410: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 66 72 65  s invoked to fre
f420: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
f430: 6f 72 79 20 61 73 20 69 74 0a 20 20 2a 2a 20 63  ory as it.  ** c
f440: 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  an, by calling s
f450: 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
f460: 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f  e_memory()..  */
f470: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f480: 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b  SHRINK_MEMORY: {
f490: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
f4a0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64  release_memory(d
f4b0: 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  b);.    break;. 
f4c0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
f4d0: 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65  PRAGMA busy_time
f4e0: 6f 75 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  out.  **   PRAGM
f4f0: 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 3d  A busy_timeout =
f500: 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c   N.  **.  ** Cal
f510: 6c 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  l sqlite3_busy_t
f520: 69 6d 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20 20  imeout(db, N).  
f530: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
f540: 6e 74 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65  nt timeout value
f550: 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73 20  .  ** if one is 
f560: 73 65 74 2e 20 20 49 66 20 6e 6f 20 62 75 73 79  set.  If no busy
f570: 20 68 61 6e 64 6c 65 72 20 6f 72 20 61 20 64 69   handler or a di
f580: 66 66 65 72 65 6e 74 20 62 75 73 79 20 68 61 6e  fferent busy han
f590: 64 6c 65 72 20 69 73 20 73 65 74 0a 20 20 2a 2a  dler is set.  **
f5a0: 20 74 68 65 6e 20 30 20 69 73 20 72 65 74 75 72   then 0 is retur
f5b0: 6e 65 64 2e 20 20 53 65 74 74 69 6e 67 20 74 68  ned.  Setting th
f5c0: 65 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 74  e busy_timeout t
f5d0: 6f 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 0a  o 0 or negative.
f5e0: 20 20 2a 2a 20 64 69 73 61 62 6c 65 73 20 74 68    ** disables th
f5f0: 65 20 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a  e timeout..  */.
f600: 20 20 2f 2a 63 61 73 65 20 50 72 61 67 54 79 70    /*case PragTyp
f610: 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 2a 2f 20  _BUSY_TIMEOUT*/ 
f620: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 61  default: {.    a
f630: 73 73 65 72 74 28 20 70 50 72 61 67 6d 61 2d 3e  ssert( pPragma->
f640: 65 50 72 61 67 54 79 70 3d 3d 50 72 61 67 54 79  ePragTyp==PragTy
f650: 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 20 29  p_BUSY_TIMEOUT )
f660: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
f670: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f680: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
f690: 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  b, sqlite3Atoi(z
f6a0: 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20  Right));.    }. 
f6b0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
f6c0: 6e 74 28 76 2c 20 64 62 2d 3e 62 75 73 79 54 69  nt(v, db->busyTi
f6d0: 6d 65 6f 75 74 29 3b 0a 20 20 20 20 62 72 65 61  meout);.    brea
f6e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f6f0: 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f  *   PRAGMA soft_
f700: 68 65 61 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20  heap_limit.  ** 
f710: 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68 65    PRAGMA soft_he
f720: 61 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20 20 2a  ap_limit = N.  *
f730: 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
f740: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33 34  ATION-OF: R-2634
f750: 33 2d 34 35 39 33 30 20 54 68 69 73 20 70 72 61  3-45930 This pra
f760: 67 6d 61 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  gma invokes the.
f770: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66    ** sqlite3_sof
f780: 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 29  t_heap_limit64()
f790: 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 20   interface with 
f7a0: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 4e 2c 20  the argument N, 
f7b0: 69 66 20 4e 20 69 73 0a 20 20 2a 2a 20 73 70 65  if N is.  ** spe
f7c0: 63 69 66 69 65 64 20 61 6e 64 20 69 73 20 61 20  cified and is a 
f7d0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
f7e0: 65 67 65 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c 45  eger..  ** IMPLE
f7f0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
f800: 36 34 34 35 31 2d 30 37 31 36 33 20 54 68 65 20  64451-07163 The 
f810: 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20  soft_heap_limit 
f820: 70 72 61 67 6d 61 20 61 6c 77 61 79 73 0a 20 20  pragma always.  
f830: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  ** returns the s
f840: 61 6d 65 20 69 6e 74 65 67 65 72 20 74 68 61 74  ame integer that
f850: 20 77 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e   would be return
f860: 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 73  ed by the.  ** s
f870: 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
f880: 5f 6c 69 6d 69 74 36 34 28 2d 31 29 20 43 2d 6c  _limit64(-1) C-l
f890: 61 6e 67 75 61 67 65 20 66 75 6e 63 74 69 6f 6e  anguage function
f8a0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
f8b0: 61 67 54 79 70 5f 53 4f 46 54 5f 48 45 41 50 5f  agTyp_SOFT_HEAP_
f8c0: 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 73 71 6c  LIMIT: {.    sql
f8d0: 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20  ite3_int64 N;.  
f8e0: 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26 20    if( zRight && 
f8f0: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
f900: 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e 29  oI64(zRight, &N)
f910: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f920: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 66       sqlite3_sof
f930: 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e  t_heap_limit64(N
f940: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
f950: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
f960: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
f970: 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 29 3b 0a  p_limit64(-1));.
f980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f990: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f9a0: 4d 41 20 74 68 72 65 61 64 73 0a 20 20 2a 2a 20  MA threads.  ** 
f9b0: 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73    PRAGMA threads
f9c0: 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   = N.  **.  ** C
f9d0: 6f 6e 66 69 67 75 72 65 20 74 68 65 20 6d 61 78  onfigure the max
f9e0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 77  imum number of w
f9f0: 6f 72 6b 65 72 20 74 68 72 65 61 64 73 2e 20 20  orker threads.  
fa00: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 0a 20  Return the new. 
fa10: 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c 20 77 68 69   ** maximum, whi
fa20: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ch might be less
fa30: 20 74 68 61 6e 20 72 65 71 75 65 73 74 65 64 2e   than requested.
fa40: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
fa50: 67 54 79 70 5f 54 48 52 45 41 44 53 3a 20 7b 0a  gTyp_THREADS: {.
fa60: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
fa70: 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  4 N;.    if( zRi
fa80: 67 68 74 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ght.     && sqli
fa90: 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
faa0: 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51  (zRight, &N)==SQ
fab0: 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20  LITE_OK.     && 
fac0: 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  N>=0.    ){.    
fad0: 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
fae0: 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  db, SQLITE_LIMIT
faf0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c  _WORKER_THREADS,
fb00: 20 28 69 6e 74 29 28 4e 26 30 78 37 66 66 66 66   (int)(N&0x7ffff
fb10: 66 66 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  fff));.    }.   
fb20: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
fb30: 28 76 2c 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  (v, sqlite3_limi
fb40: 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d  t(db, SQLITE_LIM
fb50: 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
fb60: 53 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  S, -1));.    bre
fb70: 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66  ak;.  }..#if def
fb80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
fb90: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
fba0: 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a 0a  LITE_TEST).  /*.
fbb0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20    ** Report the 
fbc0: 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
fbd0: 20 66 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20 61   file logs for a
fbe0: 6c 6c 20 64 61 74 61 62 61 73 65 73 0a 20 20 2a  ll databases.  *
fbf0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
fc00: 5f 4c 4f 43 4b 5f 53 54 41 54 55 53 3a 20 7b 0a  _LOCK_STATUS: {.
fc10: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
fc20: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4c   char *const azL
fc30: 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  ockName[] = {.  
fc40: 20 20 20 20 22 75 6e 6c 6f 63 6b 65 64 22 2c 20      "unlocked", 
fc50: 22 73 68 61 72 65 64 22 2c 20 22 72 65 73 65 72  "shared", "reser
fc60: 76 65 64 22 2c 20 22 70 65 6e 64 69 6e 67 22 2c  ved", "pending",
fc70: 20 22 65 78 63 6c 75 73 69 76 65 22 0a 20 20 20   "exclusive".   
fc80: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
fc90: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
fca0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
fcb0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
fcc0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
fcd0: 70 42 74 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  pBt;.      const
fce0: 20 63 68 61 72 20 2a 7a 53 74 61 74 65 20 3d 20   char *zState = 
fcf0: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 20  "unknown";.     
fd00: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
fd10: 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62  ( db->aDb[i].zDb
fd20: 53 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69  SName==0 ) conti
fd30: 6e 75 65 3b 0a 20 20 20 20 20 20 70 42 74 20 3d  nue;.      pBt =
fd40: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
fd50: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 3d 3d  .      if( pBt==
fd60: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
fd70: 65 50 61 67 65 72 28 70 42 74 29 3d 3d 30 20 29  ePager(pBt)==0 )
fd80: 7b 0a 20 20 20 20 20 20 20 20 7a 53 74 61 74 65  {.        zState
fd90: 20 3d 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20 20   = "closed";.   
fda0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
fdb0: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
fdc0: 6c 28 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61 44  l(db, i ? db->aD
fdd0: 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20  b[i].zDbSName : 
fde0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
fe10: 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c  FCNTL_LOCKSTATE,
fe20: 20 26 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   &j)==SQLITE_OK 
fe30: 29 7b 0a 20 20 20 20 20 20 20 20 20 7a 53 74 61  ){.         zSta
fe40: 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b  te = azLockName[
fe50: 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
fe60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
fe70: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73  tiLoad(v, 1, "ss
fe80: 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  ", db->aDb[i].zD
fe90: 62 53 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29 3b  bSName, zState);
fea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
feb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
fec0: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b  esultRow, 1, 2);
fed0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
fee0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
fef0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
ff00: 43 4f 44 45 43 0a 20 20 63 61 73 65 20 50 72 61  CODEC.  case Pra
ff10: 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20  gTyp_KEY: {.    
ff20: 69 66 28 20 7a 52 69 67 68 74 20 29 20 73 71 6c  if( zRight ) sql
ff30: 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
ff40: 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c  zDb, zRight, sql
ff50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69  ite3Strlen30(zRi
ff60: 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  ght));.    break
ff70: 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61  ;.  }.  case Pra
ff80: 67 54 79 70 5f 52 45 4b 45 59 3a 20 7b 0a 20 20  gTyp_REKEY: {.  
ff90: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20 73    if( zRight ) s
ffa0: 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28  qlite3_rekey_v2(
ffb0: 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c  db, zDb, zRight,
ffc0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ffd0: 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 62  (zRight));.    b
ffe0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65  reak;.  }.  case
fff0: 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45 59 3a   PragTyp_HEXKEY:
10000 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
10010 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42  t ){.      u8 iB
10020 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  yte;.      int i
10030 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b 65  ;.      char zKe
10040 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72  y[40];.      for
10050 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69  (i=0, iByte=0; i
10060 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20  <sizeof(zKey)*2 
10070 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
10080 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69  it(zRight[i]); i
10090 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79  ++){.        iBy
100a0 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20  te = (iByte<<4) 
100b0 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e  + sqlite3HexToIn
100c0 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20  t(zRight[i]);.  
100d0 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21        if( (i&1)!
100e0 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d  =0 ) zKey[i/2] =
100f0 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a   iByte;.      }.
10100 20 20 20 20 20 20 69 66 28 20 28 7a 4c 65 66 74        if( (zLeft
10110 5b 33 5d 20 26 20 30 78 66 29 3d 3d 30 78 62 20  [3] & 0xf)==0xb 
10120 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10130 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
10140 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20  b, zKey, i/2);. 
10150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10160 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65      sqlite3_reke
10170 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
10180 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20  ey, i/2);.      
10190 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
101a0 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  k;.  }.#endif.#i
101b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
101c0 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64  _HAS_CODEC) || d
101d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
101e0 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63 61  ABLE_CEROD).  ca
101f0 73 65 20 50 72 61 67 54 79 70 5f 41 43 54 49 56  se PragTyp_ACTIV
10200 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a 20  ATE_EXTENSIONS: 
10210 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 23 69  if( zRight ){.#i
10220 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
10230 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 73 71  CODEC.    if( sq
10240 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52  lite3StrNICmp(zR
10250 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20 34 29  ight, "see-", 4)
10260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10270 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73 65  ite3_activate_se
10280 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a 20  e(&zRight[4]);. 
10290 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64     }.#endif.#ifd
102a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
102b0 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28 20 73  _CEROD.    if( s
102c0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
102d0 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d 22 2c  Right, "cerod-",
102e0 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   6)==0 ){.      
102f0 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65  sqlite3_activate
10300 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74 5b 36  _cerod(&zRight[6
10310 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ]);.    }.#endif
10320 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
10330 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64  ndif..  } /* End
10340 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 73   of the PRAGMA s
10350 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54  witch */..  /* T
10360 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
10370 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  ck is a no-op un
10380 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55  less SQLITE_DEBU
10390 47 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49 74  G is defined. It
103a0 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72 70  s only.  ** purp
103b0 6f 73 65 20 69 73 20 74 6f 20 65 78 65 63 75 74  ose is to execut
103c0 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
103d0 6d 65 6e 74 73 20 74 6f 20 76 65 72 69 66 79 20  ments to verify 
103e0 74 68 61 74 20 69 66 20 74 68 65 0a 20 20 2a 2a  that if the.  **
103f0 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d   PragFlg_NoColum
10400 6e 73 31 20 66 6c 61 67 20 69 73 20 73 65 74 20  ns1 flag is set 
10410 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 73  and the caller s
10420 70 65 63 69 66 69 65 64 20 61 6e 20 61 72 67 75  pecified an argu
10430 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ment.  ** to the
10440 20 50 52 41 47 4d 41 2c 20 74 68 65 20 69 6d 70   PRAGMA, the imp
10450 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73 20  lementation has 
10460 6e 6f 74 20 61 64 64 65 64 20 61 6e 79 20 4f 50  not added any OP
10470 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a 2a  _ResultRow .  **
10480 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 6f   instructions to
10490 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20 69   the VM.  */.  i
104a0 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
104b0 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
104c0 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20 7a  NoColumns1) && z
104d0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
104e0 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
104f0 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20  ResultRow(v);.  
10500 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20  }..pragma_out:. 
10510 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10520 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c  b, zLeft);.  sql
10530 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10540 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65  Right);.}.#ifnde
10550 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10560 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a  RTUALTABLE./****
10570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70  *********.** Imp
105c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
105d0 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  n eponymous virt
105e0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72  ual table that r
105f0 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a  uns a pragma..**
10600 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
10610 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 50 72  ct PragmaVtab Pr
10620 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65  agmaVtab;.typede
10630 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  f struct PragmaV
10640 74 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61  tabCursor Pragma
10650 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75  VtabCursor;.stru
10660 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a  ct PragmaVtab {.
10670 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62    sqlite3_vtab b
10680 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ase;        /* B
10690 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
106a0 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
106b0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
106c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
106d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
106e0 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20  ion to which it 
106f0 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e  belongs */.  con
10700 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
10710 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
10720 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a  f the pragma */.
10730 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20    u8 nHidden;   
10740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10750 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20  umber of hidden 
10760 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
10770 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20  iHidden;        
10780 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10790 6f 66 20 74 68 65 20 66 69 72 73 74 20 68 69 64  of the first hid
107a0 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b  den column */.};
107b0 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74  .struct PragmaVt
107c0 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  abCursor {.  sql
107d0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
107e0 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63   base; /* Base c
107f0 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66  lass.  Must be f
10800 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
10810 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b  3_stmt *pPragma;
10820 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d      /* The pragm
10830 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  a statement to r
10840 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69  un */.  sqlite_i
10850 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20  nt64 iRowid;    
10860 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
10870 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a  id */.  char *az
10880 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  Arg[2];         
10890 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
108a0 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  e argument and s
108b0 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  chema */.};../* 
108c0 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
108d0 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
108e0 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e  xConnect method.
108f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10900 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
10910 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10920 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
10930 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
10940 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
10950 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
10960 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
10970 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
10980 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65  const PragmaName
10990 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e   *pPragma = (con
109a0 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70  st PragmaName*)p
109b0 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  Aux;.  PragmaVta
109c0 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69  b *pTab = 0;.  i
109d0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
109e0 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d  j;.  char cSep =
109f0 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d   '(';.  StrAccum
10a00 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75   acc;.  char zBu
10a10 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45  f[200];..  UNUSE
10a20 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
10a30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10a40 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20 73  METER(argv);.  s
10a50 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
10a60 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 75 66  it(&acc, 0, zBuf
10a70 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
10a80 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  0);.  sqlite3Str
10a90 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26  AccumAppendAll(&
10aa0 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41 42  acc, "CREATE TAB
10ab0 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69 3d  LE x");.  for(i=
10ac0 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69 50  0, j=pPragma->iP
10ad0 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72 61  ragCName; i<pPra
10ae0 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 3b  gma->nPragCName;
10af0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
10b00 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
10b10 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c  acc, "%c\"%s\"",
10b20 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65   cSep, pragCName
10b30 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d  [j]);.    cSep =
10b40 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   ',';.  }.  if( 
10b50 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  i==0 ){.    sqli
10b60 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c  te3XPrintf(&acc,
10b70 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50 72 61   "(\"%s\"", pPra
10b80 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  gma->zName);.   
10b90 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20   cSep = ',';.   
10ba0 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20   i++;.  }.  j = 
10bb0 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61  0;.  if( pPragma
10bc0 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61  ->mPragFlg & Pra
10bd0 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29 7b 0a  gFlg_Result1 ){.
10be0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
10bf0 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63  cumAppendAll(&ac
10c00 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22  c, ",arg HIDDEN"
10c10 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
10c20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d    if( pPragma->m
10c30 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46  PragFlg & (PragF
10c40 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61  lg_SchemaOpt|Pra
10c50 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20  gFlg_SchemaReq) 
10c60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  ){.    sqlite3St
10c70 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
10c80 26 61 63 63 2c 20 22 2c 73 63 68 65 6d 61 20 48  &acc, ",schema H
10c90 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b  IDDEN");.    j++
10ca0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
10cb0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 61  trAccumAppend(&a
10cc0 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 73  cc, ")", 1);.  s
10cd0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
10ce0 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 61 73  nish(&acc);.  as
10cf0 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 42 75  sert( strlen(zBu
10d00 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66  f) < sizeof(zBuf
10d10 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  )-1 );.  rc = sq
10d20 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
10d30 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20 20  ab(db, zBuf);.  
10d40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10d50 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  K ){.    pTab = 
10d60 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73 71 6c  (PragmaVtab*)sql
10d70 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
10d80 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b  of(PragmaVtab));
10d90 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
10da0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
10db0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
10dd0 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69  mset(pTab, 0, si
10de0 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29  zeof(PragmaVtab)
10df0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  );.      pTab->p
10e00 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b 0a  Name = pPragma;.
10e10 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d        pTab->db =
10e20 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   db;.      pTab-
10e30 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20 20  >iHidden = i;.  
10e40 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64 64 65      pTab->nHidde
10e50 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d  n = j;.    }.  }
10e60 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72 72  else{.    *pzErr
10e70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10e80 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
10e90 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
10ea0 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28  }..  *ppVtab = (
10eb0 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 54  sqlite3_vtab*)pT
10ec0 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ab;.  return rc;
10ed0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d  .}../* .** Pragm
10ee0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
10ef0 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65  module xDisconne
10f00 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ct method..*/.st
10f10 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
10f20 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  tabDisconnect(sq
10f30 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
10f40 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  b){.  PragmaVtab
10f50 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61   *pTab = (Pragma
10f60 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 73  Vtab*)pVtab;.  s
10f70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62  qlite3_free(pTab
10f80 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10f90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67  TE_OK;.}../* Fig
10fa0 75 72 65 20 6f 75 74 20 74 68 65 20 62 65 73 74  ure out the best
10fb0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 74 6f   index to use to
10fc0 20 73 65 61 72 63 68 20 61 20 70 72 61 67 6d 61   search a pragma
10fd0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
10fe0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
10ff0 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79 20 69  not really any i
11000 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20 20 42  ndex choices.  B
11010 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 65 6e  ut we want to en
11020 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a 20 71  courage the.** q
11030 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f 20  uery planner to 
11040 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  give == constrai
11050 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20 68  nts on as many h
11060 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73  idden parameters
11070 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c   as.** possible,
11080 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c 79 20   and especially 
11090 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68 69 64  on the first hid
110a0 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 20  den parameter.  
110b0 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 68  So return a.** h
110c0 69 67 68 20 63 6f 73 74 20 69 66 20 68 69 64 64  igh cost if hidd
110d0 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  en parameters ar
110e0 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2e  e unconstrained.
110f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
11100 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64  ragmaVtabBestInd
11110 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
11120 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
11130 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
11140 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  fo){.  PragmaVta
11150 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
11160 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20 63 6f  aVtab*)tab;.  co
11170 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
11180 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
11190 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74  int *pConstraint
111a0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
111b0 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20  int seen[2];..  
111c0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
111d0 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  tedCost = (doubl
111e0 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  e)1;.  if( pTab-
111f0 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20 72  >nHidden==0 ){ r
11200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11210 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74   }.  pConstraint
11220 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
11230 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65 65 6e  nstraint;.  seen
11240 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e 5b  [0] = 0;.  seen[
11250 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  1] = 0;.  for(i=
11260 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
11270 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
11280 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b   pConstraint++){
11290 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72  .    if( pConstr
112a0 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20  aint->usable==0 
112b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
112c0 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
112d0 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op!=SQLITE_INDE
112e0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
112f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11300 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
11310 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62 2d  >iColumn < pTab-
11320 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e 74 69  >iHidden ) conti
11330 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43 6f  nue;.    j = pCo
11340 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
11350 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64 64 65  n - pTab->iHidde
11360 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  n;.    assert( j
11370 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65 65 6e   < 2 );.    seen
11380 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20  [j] = i+1;.  }. 
11390 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30 20   if( seen[0]==0 
113a0 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ){.    pIdxInfo-
113b0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
113c0 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34 38 33   (double)2147483
113d0 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  647;.    pIdxInf
113e0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
113f0 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b 0a 20   = 2147483647;. 
11400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11410 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20 73  _OK;.  }.  j = s
11420 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64 78  een[0]-1;.  pIdx
11430 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
11440 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e  tUsage[j].argvIn
11450 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64 78 49  dex = 1;.  pIdxI
11460 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
11470 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20  Usage[j].omit = 
11480 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b 31 5d  1;.  if( seen[1]
11490 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
114a0 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49 6e  ITE_OK;.  pIdxIn
114b0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
114c0 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b 0a  t = (double)20;.
114d0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
114e0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30 3b 0a  matedRows = 20;.
114f0 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b    j = seen[1]-1;
11500 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
11510 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
11520 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a  .argvIndex = 2;.
11530 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
11540 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e  straintUsage[j].
11550 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  omit = 1;.  retu
11560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11570 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  ./* Create a new
11580 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
11590 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  pragma virtual t
115a0 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  able */.static i
115b0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65  nt pragmaVtabOpe
115c0 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
115d0 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVtab, sqlite3_v
115e0 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
115f0 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61  ursor){.  Pragma
11600 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
11610 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72 61 67  ;.  pCsr = (Prag
11620 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 73 71  maVtabCursor*)sq
11630 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
11640 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 69  eof(*pCsr));.  i
11650 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72 65 74  f( pCsr==0 ) ret
11660 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11670 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c  ;.  memset(pCsr,
11680 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67 6d   0, sizeof(Pragm
11690 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b 0a 20  aVtabCursor));. 
116a0 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61   pCsr->base.pVta
116b0 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70 70  b = pVtab;.  *pp
116c0 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72 2d 3e  Cursor = &pCsr->
116d0 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  base;.  return S
116e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
116f0 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65 6e  Clear all conten
11700 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20 76 69  t from pragma vi
11710 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
11720 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or. */.static vo
11730 69 64 20 70 72 61 67 6d 61 56 74 61 62 43 75 72  id pragmaVtabCur
11740 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d 61 56  sorClear(PragmaV
11750 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 29  tabCursor *pCsr)
11760 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
11770 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
11780 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20  sr->pPragma);.  
11790 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d 20  pCsr->pPragma = 
117a0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
117b0 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e  ArraySize(pCsr->
117c0 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20 20  azArg); i++){.  
117d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
117e0 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a  Csr->azArg[i]);.
117f0 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b      pCsr->azArg[
11800 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = 0;.  }.}../
11810 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67 6d 61  * Close a pragma
11820 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
11830 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20  ursor */.static 
11840 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43 6c  int pragmaVtabCl
11850 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ose(sqlite3_vtab
11860 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
11870 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
11880 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67 6d  r *pCsr = (Pragm
11890 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63 75 72  aVtabCursor*)cur
118a0 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75  ;.  pragmaVtabCu
118b0 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b  rsorClear(pCsr);
118c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
118d0 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCsr);.  return 
118e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
118f0 20 41 64 76 61 6e 63 65 20 74 68 65 20 70 72 61   Advance the pra
11900 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  gma virtual tabl
11910 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
11920 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61 74  next row */.stat
11930 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
11940 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74  bNext(sqlite3_vt
11950 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
11960 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
11970 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
11980 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
11990 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
119a0 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  or;.  int rc = S
119b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
119c0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 78 52  Increment the xR
119d0 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  owid value */.  
119e0 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a  pCsr->iRowid++;.
119f0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
11a00 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69 66 28  pPragma );.  if(
11a10 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c   SQLITE_ROW!=sql
11a20 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e  ite3_step(pCsr->
11a30 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20 20  pPragma) ){.    
11a40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
11a50 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61  alize(pCsr->pPra
11a60 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  gma);.    pCsr->
11a70 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20  pPragma = 0;.   
11a80 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   pragmaVtabCurso
11a90 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20  rClear(pCsr);.  
11aa0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11ab0 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20  ../* .** Pragma 
11ac0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
11ad0 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74  dule xFilter met
11ae0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
11af0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c  nt pragmaVtabFil
11b00 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
11b10 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
11b20 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20  bCursor, .  int 
11b30 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  idxNum, const ch
11b40 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e  ar *idxStr,.  in
11b50 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
11b60 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
11b70 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
11b80 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
11b90 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
11ba0 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61  tabCursor;.  Pra
11bb0 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
11bc0 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56  (PragmaVtab*)(pV
11bd0 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
11be0 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  );.  int rc;.  i
11bf0 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41 63  nt i, j;.  StrAc
11c00 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20  cum acc;.  char 
11c10 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45 44  *zSql;..  UNUSED
11c20 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78 4e 75  _PARAMETER(idxNu
11c30 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  m);.  UNUSED_PAR
11c40 41 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a  AMETER(idxStr);.
11c50 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73    pragmaVtabCurs
11c60 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20  orClear(pCsr);. 
11c70 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61 6d   j = (pTab->pNam
11c80 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  e->mPragFlg & Pr
11c90 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29 21 3d  agFlg_Result1)!=
11ca0 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f 72  0 ? 0 : 1;.  for
11cb0 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
11cc0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 73 73  +, j++){.    ass
11cd0 65 72 74 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ert( j<ArraySize
11ce0 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b  (pCsr->azArg) );
11cf0 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67  .    pCsr->azArg
11d00 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [j] = sqlite3_mp
11d10 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
11d20 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
11d30 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20 69 66  rgv[i]));.    if
11d40 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d  ( pCsr->azArg[j]
11d50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
11d60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11d80 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
11d90 74 28 26 61 63 63 2c 20 30 2c 20 30 2c 20 30 2c  t(&acc, 0, 0, 0,
11da0 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d 69   pTab->db->aLimi
11db0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
11dc0 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 73  QL_LENGTH]);.  s
11dd0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
11de0 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 50  pendAll(&acc, "P
11df0 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28 20  RAGMA ");.  if( 
11e00 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20 29  pCsr->azArg[1] )
11e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
11e20 69 6e 74 66 28 26 61 63 63 2c 20 22 25 51 2e 22  intf(&acc, "%Q."
11e30 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d  , pCsr->azArg[1]
11e40 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11e50 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
11e60 6c 28 26 61 63 63 2c 20 70 54 61 62 2d 3e 70 4e  l(&acc, pTab->pN
11e70 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  ame->zName);.  i
11e80 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30  f( pCsr->azArg[0
11e90 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
11ea0 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 3d  XPrintf(&acc, "=
11eb0 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  %Q", pCsr->azArg
11ec0 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  [0]);.  }.  zSql
11ed0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
11ee0 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b 0a  umFinish(&acc);.
11ef0 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
11f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11f10 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  MEM;.  rc = sqli
11f20 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
11f30 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  Tab->db, zSql, -
11f40 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67 6d  1, &pCsr->pPragm
11f50 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  a, 0);.  sqlite3
11f60 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
11f70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11f80 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61   ){.    pTab->ba
11f90 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
11fa0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
11fb0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
11fc0 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20 20  g(pTab->db));.  
11fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11fe0 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d 61  .  return pragma
11ff0 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43 75  VtabNext(pVtabCu
12000 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsor);.}../*.** 
12010 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74  Pragma virtual t
12020 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66  able module xEof
12030 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
12040 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12050 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61  bEof(sqlite3_vta
12060 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
12070 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61  ursor){.  Pragma
12080 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
12090 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
120a0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
120b0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43 73  r;.  return (pCs
120c0 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b 0a  r->pPragma==0);.
120d0 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75 6d  }../* The xColum
120e0 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79 20  n method simply 
120f0 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72 72  returns the corr
12100 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
12110 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52 41   from.** the PRA
12120 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  GMA.  .*/.static
12130 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
12140 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33  olumn(.  sqlite3
12150 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
12160 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73 71  tabCursor, .  sq
12170 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
12180 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b 0a  tx, .  int i.){.
12190 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
121a0 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
121b0 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
121c0 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72 61  tabCursor;.  Pra
121d0 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d 20  gmaVtab *pTab = 
121e0 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70 56  (PragmaVtab*)(pV
121f0 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
12200 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62 2d  );.  if( i<pTab-
12210 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20 20  >iHidden ){.    
12220 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
12230 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
12240 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
12250 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69 29  Csr->pPragma, i)
12260 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12270 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
12280 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e 61  ext(ctx, pCsr->a
12290 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48 69  zArg[i-pTab->iHi
122a0 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f  dden],-1,SQLITE_
122b0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
122c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
122d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  OK;.}../* .** Pr
122e0 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
122f0 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64  le module xRowid
12300 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
12310 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12320 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  bRowid(sqlite3_v
12330 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
12340 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f  bCursor, sqlite_
12350 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72 61  int64 *p){.  Pra
12360 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
12370 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
12380 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
12390 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43 73  rsor;.  *p = pCs
123a0 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74  r->iRowid;.  ret
123b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
123c0 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20  ../* The pragma 
123d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
123e0 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ject */.static c
123f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
12400 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d 6f  ule pragmaVtabMo
12410 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20  dule = {.  0,   
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
12440 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
12470 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62 6c   - create a tabl
12480 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  e */.  pragmaVta
12490 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  bConnect,       
124a0 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
124b0 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 20  - connect to an 
124c0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a  existing table *
124d0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42 65  /.  pragmaVtabBe
124e0 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  stIndex,        
124f0 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d   /* xBestIndex -
12500 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72 63   Determine searc
12510 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
12520 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f 6e  pragmaVtabDiscon
12530 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
12540 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44 69  xDisconnect - Di
12550 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61 20  sconnect from a 
12560 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20  table */.  0,   
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74          /* xDest
12590 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61 62  roy - Drop a tab
125a0 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
125b0 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  abOpen,         
125c0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
125d0 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
125e0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c 6f  .  pragmaVtabClo
125f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
12600 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
12610 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
12620 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72  pragmaVtabFilter
12630 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12640 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
12650 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
12660 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d 61  ints */.  pragma
12670 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20 20  VtabNext,       
12680 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
12690 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
126a0 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
126b0 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  abEof,          
126c0 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a       /* xEof */.
126d0 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75    pragmaVtabColu
126e0 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
126f0 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
12700 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67 6d   data */.  pragm
12710 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20 20  aVtabRowid,     
12720 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
12730 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
12740 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72 69  /* xUpdate - wri
12770 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  te data */.  0, 
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
127a0 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e  gin - begin tran
127b0 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
127e0 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61  nc - sync transa
127f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
12820 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e  it - commit tran
12830 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
12860 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63  llback - rollbac
12870 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  k transaction */
12880 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  /* xFindFunction
128b0 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72   - function over
128c0 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c 20  loading */.  0, 
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
128f0 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74 68  name - rename th
12900 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20  e table */.  0, 
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
12930 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
12940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
12960 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20  lease */.  0    
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
12990 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  backTo */.};../*
129a0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
129b0 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73 20   if zTabName is 
129c0 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20  really the name 
129d0 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49 66  of a pragma.  If
129e0 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20   it is,.** then 
129f0 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f 6e  register an epon
12a00 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
12a10 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72 61  ble for that pra
12a20 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  gma and return.*
12a30 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
12a40 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74  he Module object
12a50 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 72   for the new vir
12a60 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d  tual table..*/.M
12a70 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50 72  odule *sqlite3Pr
12a80 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65 72  agmaVtabRegister
12a90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
12aa0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12ab0 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61  {.  const Pragma
12ac0 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61  Name *pName;.  a
12ad0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73  ssert( sqlite3_s
12ae0 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  trnicmp(zName, "
12af0 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20  pragma_", 7)==0 
12b00 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72 61  );.  pName = pra
12b10 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b  gmaLocate(zName+
12b20 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d  7);.  if( pName=
12b30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12b40 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72   if( (pName->mPr
12b50 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
12b60 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c 67  _Result0|PragFlg
12b70 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29 20  _Result1))==0 ) 
12b80 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
12b90 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
12ba0 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
12bb0 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20  , zName)==0 );. 
12bc0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
12bd0 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28  tabCreateModule(
12be0 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67  db, zName, &prag
12bf0 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76  maVtabModule, (v
12c00 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a  oid*)pName, 0);.
12c10 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
12c20 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12c30 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66  TABLE */..#endif
12c40 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12c50 50 52 41 47 4d 41 20 2a 2f 0a                    PRAGMA */.